/ Hex Artifact Content
Login

Artifact 1f77fc8d4ca6c8119c46e578c6595b8bc58b2966:


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 34 34  : pager.c,v 1.44
0350: 36 20 32 30 30 38 2f 30 35 2f 31 33 20 31 33 3a  6 2008/05/13 13:
0360: 32 37 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a  27:34 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20  u8 dbModified;  
4000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4010: 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65  rue if there are
4020: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20   any changes to 
4030: 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 63  the Db */.  u8 c
4040: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
4050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
4060: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
4070: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
4080: 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 76 66  nter */.  u32 vf
4090: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
40a0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
40b0: 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  or sqlite3_vfs.x
40c0: 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Open() */.  int 
40d0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
40e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
40f0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
4100: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
4110: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
4120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4130: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4140: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
4150: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4170: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4180: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
4190: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
41c0: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
41d0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
41e0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
4210: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
4220: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
4230: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
4250: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
4260: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
4270: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
4280: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
42a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
42b0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
42c0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
42d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
42e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
42f0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
4300: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
4310: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
4320: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4340: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
4350: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
4380: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
4390: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
43a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
43c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
43d0: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
43e0: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
43f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
4400: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
4410: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
4420: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
4430: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
4440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4450: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
4460: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
4470: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 42 69  database */.  Bi
4480: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
4490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
44a0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
44b0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
44c0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 42 69 74  se file */.  Bit
44d0: 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b 20 20 20  vec *pInStmt;   
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
44f0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
4500: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
4510: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4520: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4530: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4540: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4550: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4560: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4570: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
45a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
45b0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
45c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
45d0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45e0: 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b  char *zStmtJrnl;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4600: 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 74 65  ame of the state
4610: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ment journal fil
4620: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
4630: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
4640: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
4650: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
4660: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4670: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
4680: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
4690: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
46a0: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
46b0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
46c0: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
46d0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
46e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
46f0: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
4700: 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c  r */.  PagerLruL
4710: 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20 20  ist lru;        
4720: 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20 6f     /* LRU list o
4730: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
4740: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
4770: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
4780: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
4790: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
47a0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
47b0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
47c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
47d0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
47e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
47f0: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4830: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4840: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4850: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
4860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4870: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
4880: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
4890: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
48a0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
48b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
48c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
48d0: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
48e0: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
48f0: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4900: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4910: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4920: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4930: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4950: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
4960: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
4970: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
4980: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4990: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
49a0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
49b0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
49c0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
49d0: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
49e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
49f0: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4a00: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4a10: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4a20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4a30: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4a40: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4a50: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
4a60: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
4a70: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
4a80: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
4a90: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
4aa0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
4ab0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4ac0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4ad0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4ae0: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4b00: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4b10: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4b20: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4b30: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4b40: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4b50: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
4b60: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
4b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b80: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
4b90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
4ba0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
4bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4bc0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4bd0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4be0: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4c00: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4c10: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4c20: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4c30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4c40: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4c50: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4c70: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69 73  oubly linked lis
4c80: 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20 77  t of pagers on w
4c90: 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72 20  hich */.  Pager 
4ca0: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
4cb0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
4cc0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
4cd0: 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20  ) will work */. 
4ce0: 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 69 49   volatile int iI
4cf0: 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 2f 2a 20  nUseMM;      /* 
4d00: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61 76  Non-zero if unav
4d10: 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f  ailable to MM */
4d20: 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  .  volatile int 
4d30: 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20 2f  iInUseDB;      /
4d40: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 6e  * Non-zero if in
4d50: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
4d60: 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 20 20 75  _memory() */.  u
4d70: 38 20 6f 6e 50 61 67 65 72 4c 69 73 74 3b 20 20  8 onPagerList;  
4d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4d90: 75 65 20 69 66 20 70 61 72 74 20 6f 66 20 74 68  ue if part of th
4da0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  e sqlite3PagerLi
4db0: 73 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  st */.#endif.  c
4dc0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
4dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
4de0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
4df0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
4e00: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61  tmp use */.  cha
4e10: 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d  r dbFileVers[16]
4e20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ;        /* Chan
4e30: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
4e40: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
4e50: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
4e60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
4e70: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
4e80: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
4e90: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
4ea0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
4eb0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4ec0: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
4ed0: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
4ee0: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
4ef0: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
4f00: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
4f10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4f20: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
4f30: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
4f40: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f50: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
4f60: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
4f70: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
4f80: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
4f90: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
4fa0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4fb0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
4fc0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
4fd0: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
4fe0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4ff0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
5000: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
5010: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
5020: 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
5030: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
5040: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
5050: 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64  ges freed */.# d
5060: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
5070: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
5080: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
5090: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(v).#endif../*
50a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
50b0: 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  g variable point
50c0: 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  s to the head of
50d0: 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64   a double-linked
50e0: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20   list.** of all 
50f0: 70 61 67 65 72 73 20 74 68 61 74 20 61 72 65 20  pagers that are 
5100: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67  eligible for pag
5110: 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68  e stealing by th
5120: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c  e.** sqlite3_rel
5130: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e  ease_memory() in
5140: 74 65 72 66 61 63 65 2e 20 20 41 63 63 65 73 73  terface.  Access
5150: 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73   to this list is
5160: 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79  .** protected by
5170: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45   the SQLITE_MUTE
5180: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75  X_STATIC_MEM2 mu
5190: 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  tex..*/.#ifdef S
51a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
51b0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73  ORY_MANAGEMENT.s
51c0: 74 61 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c  tatic Pager *sql
51d0: 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20  ite3PagerList = 
51e0: 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c  0;.static PagerL
51f0: 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72  ruList sqlite3Lr
5200: 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20  uPageList = {0, 
5210: 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a  0, 0};.#endif...
5220: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
5230: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
5240: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
5250: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
5260: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
5270: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
5280: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
5290: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
52a0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
52b0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
52c0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
52d0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
52e0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
52f0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
5300: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
5310: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
5320: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
5330: 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77  al is begin.** w
5340: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
5350: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
5360: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
5370: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
5380: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
5390: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
53a0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
53b0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
53c0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
53d0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
53e0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
53f0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
5400: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
5410: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
5420: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
5430: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
5440: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
5450: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
5460: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
5470: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
5480: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
5490: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
54a0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
54b0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
54c0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
54d0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
54e0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
54f0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
5500: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
5510: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
5520: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
5530: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
5540: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
5550: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
5560: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
5570: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
5580: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
5590: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
55a0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
55b0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
55c0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
55d0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
55e0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
55f0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
5600: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
5610: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
5620: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
5630: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
5640: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
5650: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
5660: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
5670: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
5680: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
5690: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
56a0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
56b0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
56c0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
56d0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
56e0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
56f0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
5700: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
5710: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
5720: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
5730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
5740: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5750: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
5760: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
5770: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
5780: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
5790: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
57a0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
57b0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
57c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
57d0: 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d  ournal is determ
57e0: 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  ined.** by the f
57f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e  ollowing macros.
5800: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
5810: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
5820: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
5830: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
5840: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
5850: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
5860: 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68  his pager. In th
5870: 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63  e future, this c
5880: 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74  ould be.** set t
5890: 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61  o some value rea
58a0: 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  d from the disk 
58b0: 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20  controller. The 
58c0: 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61  important.** cha
58d0: 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74  racteristic is t
58e0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61  hat it is the sa
58f0: 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73  me size as a dis
5900: 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65  k sector..*/.#de
5910: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
5920: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
5930: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
5940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
5950: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
5960: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
5970: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
5980: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
5990: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
59a0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
59b0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
59c0: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
59d0: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
59e0: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
59f0: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
5a00: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
5a10: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
5a20: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
5a30: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
5a40: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5a60: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
5a70: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
5a80: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
5a90: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
5aa0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
5ab0: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
5ac0: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
5ad0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
5ae0: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
5af0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
5b00: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
5b10: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
5b20: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
5b30: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
5b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
5b50: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
5b60: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
5b70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
5b80: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
5b90: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
5ba0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
5bb0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
5bc0: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
5bd0: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
5be0: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
5bf0: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
5c00: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
5c10: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
5c20: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
5c30: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
5c40: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
5c50: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
5c60: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
5c70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
5c80: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
5c90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
5ca0: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
5cb0: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
5cc0: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
5cd0: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
5ce0: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
5cf0: 20 54 68 65 20 70 61 67 65 72 45 6e 74 65 72 28   The pagerEnter(
5d00: 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65  ) and pagerLeave
5d10: 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75  () routines acqu
5d20: 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a  ire and release.
5d30: 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61  ** a mutex on ea
5d40: 63 68 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d  ch pager.  The m
5d50: 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69 76  utex is recursiv
5d60: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
5d70: 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f   a special-purpo
5d80: 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e  se mutex.  It on
5d90: 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75  ly provides mutu
5da0: 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20  al exclusion.** 
5db0: 62 65 74 77 65 65 6e 20 74 68 65 20 42 74 72 65  between the Btre
5dc0: 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79  e and the Memory
5dd0: 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69   Management sqli
5de0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
5df0: 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ry().** function
5e00: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70  .  It does not p
5e10: 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d  revent, for exam
5e20: 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20  ple, two Btrees 
5e30: 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a  from accessing.*
5e40: 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  * the same pager
5e50: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5e60: 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61  e.  Other genera
5e70: 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65  l-purpose mutexe
5e80: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65  s in.** the btre
5e90: 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74  e layer handle t
5ea0: 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2a 0a 2a 2a  hat chore..**.**
5eb0: 20 54 68 65 20 70 61 67 65 72 4d 75 74 65 78 48   The pagerMutexH
5ec0: 65 6c 64 28 58 29 20 6d 61 63 72 6f 20 69 73 20  eld(X) macro is 
5ed0: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
5ee0: 69 6e 67 2e 20 20 54 68 69 73 20 6d 61 63 72 6f  ing.  This macro
5ef0: 20 76 65 72 69 66 69 65 73 0a 2a 2a 20 74 68 61   verifies.** tha
5f00: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2d 63  t the database-c
5f10: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 75 74 65 78 20  onnection mutex 
5f20: 69 73 20 68 65 6c 64 20 66 6f 72 20 70 61 67 65  is held for page
5f30: 72 20 58 20 61 6e 64 20 61 73 73 65 72 74 73 20  r X and asserts 
5f40: 69 66 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 2e  if it.** is not.
5f50: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5f60: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
5f70: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61  MANAGEMENT.  sta
5f80: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e  tic void pagerEn
5f90: 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ter(Pager *p){. 
5fa0: 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65     if( p->iInUse
5fb0: 44 42 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  DB>0 ){.      p-
5fc0: 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20  >iInUseDB++;.   
5fd0: 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65 66 20   }else{.#ifndef 
5fe0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f  SQLITE_MUTEX_NOO
5ff0: 50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  P.      sqlite3_
6000: 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20  mutex *mutex;.  
6010: 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69      mutex = sqli
6020: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6030: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6040: 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69  TIC_MEM2);.#endi
6050: 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  f.      sqlite3_
6060: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
6070: 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  x);.      assert
6080: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30  ( p->iInUseMM==0
6090: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e   );.      p->iIn
60a0: 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20  UseDB = 1;.     
60b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
60c0: 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20  eave(mutex);.   
60d0: 20 7d 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20   }.  }.  static 
60e0: 76 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28  void pagerLeave(
60f0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70  Pager *p){.    p
6100: 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20  ->iInUseDB--;.  
6110: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e    assert( p->iIn
6120: 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a  UseDB>=0 );.  }.
6130: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4d 75  # define pagerMu
6140: 74 65 78 48 65 6c 64 28 58 29 20 20 61 73 73 65  texHeld(X)  asse
6150: 72 74 28 20 28 58 29 2d 3e 69 49 6e 55 73 65 44  rt( (X)->iInUseD
6160: 42 3e 30 20 7c 7c 20 21 28 58 29 2d 3e 6f 6e 50  B>0 || !(X)->onP
6170: 61 67 65 72 4c 69 73 74 20 29 0a 23 65 6c 73 65  agerList ).#else
6180: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 45  .# define pagerE
6190: 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65  nter(X).# define
61a0: 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23   pagerLeave(X).#
61b0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4d 75 74   define pagerMut
61c0: 65 78 48 65 6c 64 28 58 29 0a 23 65 6e 64 69 66  exHeld(X).#endif
61d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65  ../*.** Add page
61e0: 20 70 50 67 20 74 6f 20 74 68 65 20 65 6e 64 20   pPg to the end 
61f0: 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
6200: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 73 74  st managed by st
6210: 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74  ructure.** pList
6220: 20 28 70 50 67 20 62 65 63 6f 6d 65 73 20 74 68   (pPg becomes th
6230: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
6240: 74 68 65 20 6c 69 73 74 20 2d 20 74 68 65 20 6d  the list - the m
6250: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a  ost recently .**
6260: 20 75 73 65 64 29 2e 20 41 72 67 75 6d 65 6e 74   used). Argument
6270: 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f   pLink should po
6280: 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50  int to either pP
6290: 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e  g->free or pPg->
62a0: 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64  gfree,.** depend
62b0: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 70  ing on whether p
62c0: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
62d0: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
62e0: 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c  pecific or.** gl
62f0: 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a  obal LRU list..*
6300: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69  /.static void li
6310: 73 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c 69  stAdd(PagerLruLi
6320: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
6330: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
6340: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 70  PgHdr *pPg){.  p
6350: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  Link->pNext = 0;
6360: 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  .  pLink->pPrev 
6370: 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a  = pList->pLast;.
6380: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6390: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
63a0: 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74  AGEMENT.  assert
63b0: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72  (pLink==&pPg->fr
63c0: 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50  ee || pLink==&pP
63d0: 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73  g->gfree);.  ass
63e0: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
63f0: 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21  >gfree || pList!
6400: 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  =&sqlite3LruPage
6410: 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  List);.#endif.. 
6420: 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73   if( pList->pLas
6430: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  t ){.    int iOf
6440: 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e  f = (char *)pLin
6450: 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b  k - (char *)pPg;
6460: 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  .    PagerLruLin
6470: 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28  k *pLastLink = (
6480: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
6490: 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70  &((u8 *)pList->p
64a0: 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20  Last)[iOff]);.  
64b0: 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65    pLastLink->pNe
64c0: 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73  xt = pPg;.  }els
64d0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70  e{.    assert(!p
64e0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20  List->pFirst);. 
64f0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6500: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70   = pPg;.  }..  p
6510: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50  List->pLast = pP
6520: 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73 74 2d  g;.  if( !pList-
6530: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 26 26  >pFirstSynced &&
6540: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
6550: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  0 ){.    pList->
6560: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
6570: 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
6580: 20 52 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d   Remove pPg from
6590: 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
65a0: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
65b0: 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
65c0: 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72   pList..**.** Ar
65d0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
65e0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
65f0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
6600: 20 70 50 67 2d 3e 67 66 72 65 65 2c 20 64 65 70   pPg->gfree, dep
6610: 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68  ending .** on wh
6620: 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69  ether pPg is bei
6630: 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
6640: 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f  pager-specific o
6650: 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73  r global LRU lis
6660: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6670: 64 20 6c 69 73 74 52 65 6d 6f 76 65 28 50 61 67  d listRemove(Pag
6680: 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74  erLruList *pList
6690: 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a  , PagerLruLink *
66a0: 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50  pLink, PgHdr *pP
66b0: 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  g){.  int iOff =
66c0: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
66d0: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23   (char *)pPg;..#
66e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
66f0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
6700: 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70  EMENT.  assert(p
6710: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65  Link==&pPg->free
6720: 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d   || pLink==&pPg-
6730: 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72  >gfree);.  asser
6740: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67  t(pLink==&pPg->g
6750: 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26  free || pList!=&
6760: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6770: 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  st);.#endif..  i
6780: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6790: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70 4c 69  First ){.    pLi
67a0: 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c 69  st->pFirst = pLi
67b0: 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  nk->pNext;.  }. 
67c0: 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d   if( pPg==pList-
67d0: 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 4c  >pLast ){.    pL
67e0: 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69  ist->pLast = pLi
67f0: 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  nk->pPrev;.  }. 
6800: 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65   if( pLink->pPre
6810: 76 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72  v ){.    PagerLr
6820: 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b  uLink *pPrevLink
6830: 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b   = (PagerLruLink
6840: 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e   *)(&((u8 *)pLin
6850: 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d 29  k->pPrev)[iOff])
6860: 3b 0a 20 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d  ;.    pPrevLink-
6870: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6880: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
6890: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b   pLink->pNext ){
68a0: 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e  .    PagerLruLin
68b0: 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28  k *pNextLink = (
68c0: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
68d0: 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70  &((u8 *)pLink->p
68e0: 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20  Next)[iOff]);.  
68f0: 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72    pNextLink->pPr
6900: 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  ev = pLink->pPre
6910: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  v;.  }.  if( pPg
6920: 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53  ==pList->pFirstS
6930: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
6940: 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70  dr *p = pLink->p
6950: 4e 65 78 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  Next;.    while(
6960: 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
6970: 63 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  c ){.      Pager
6980: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50  LruLink *pL = (P
6990: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26  agerLruLink *)(&
69a0: 28 28 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29  ((u8 *)p)[iOff])
69b0: 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e  ;.      p = pL->
69c0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
69d0: 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79   pList->pFirstSy
69e0: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
69f0: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
6a00: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30  pLink->pPrev = 0
6a10: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20  ;.}../* .** Add 
6a20: 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
6a30: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6a40: 65 73 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  es for the pager
6a50: 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d  . If .** memory-
6a60: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6a70: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64 20  abled, also add 
6a80: 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
6a90: 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20  global .** list 
6aa0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a  of free pages..*
6ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72  /.static void lr
6ac0: 75 4c 69 73 74 41 64 64 28 50 67 48 64 72 20 2a  uListAdd(PgHdr *
6ad0: 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64 28  pPg){.  listAdd(
6ae0: 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72  &pPg->pPager->lr
6af0: 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70  u, &pPg->free, p
6b00: 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
6b10: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
6b20: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66  _MANAGEMENT.  if
6b30: 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  ( !pPg->pPager->
6b40: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
6b50: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6b60: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6b70: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6b80: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6b90: 20 20 20 20 6c 69 73 74 41 64 64 28 26 73 71 6c      listAdd(&sql
6ba0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c  ite3LruPageList,
6bb0: 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50   &pPg->gfree, pP
6bc0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
6bd0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6be0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6bf0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6c00: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6c10: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  endif.}../* .** 
6c20: 52 65 6d 6f 76 65 20 70 61 67 65 20 70 50 67 20  Remove page pPg 
6c30: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
6c40: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6c50: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70  the associated p
6c60: 61 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f  ager..** If memo
6c70: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6c80: 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72   enabled, also r
6c90: 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74  emove pPg from t
6ca0: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a  he global list.*
6cb0: 2a 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e  * of free pages.
6cc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6cd0: 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 50 67  lruListRemove(Pg
6ce0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73  Hdr *pPg){.  lis
6cf0: 74 52 65 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50  tRemove(&pPg->pP
6d00: 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d  ager->lru, &pPg-
6d10: 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66  >free, pPg);.#if
6d20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6d30: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6d40: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  ENT.  if( !pPg->
6d50: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6d60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6d70: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6d80: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6d90: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6da0: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74  _LRU));.    list
6db0: 52 65 6d 6f 76 65 28 26 73 71 6c 69 74 65 33 4c  Remove(&sqlite3L
6dc0: 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67  ruPageList, &pPg
6dd0: 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20  ->gfree, pPg);. 
6de0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6df0: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
6e00: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6e10: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6e20: 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RU));.  }.#endif
6e30: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
6e40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
6e50: 65 64 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  ed just after th
6e60: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
6e70: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
6e80: 0a 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67  .** from all pag
6e90: 65 73 20 6d 61 6e 61 67 65 64 20 62 79 20 70 50  es managed by pP
6ea0: 61 67 65 72 20 28 75 73 75 61 6c 6c 79 20 62 65  ager (usually be
6eb0: 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
6ec0: 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75  l file.** has ju
6ed0: 73 74 20 62 65 65 6e 20 73 79 6e 63 65 64 29 2e  st been synced).
6ee0: 20 49 74 20 75 70 64 61 74 65 73 20 74 68 65 20   It updates the 
6ef0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6f00: 73 74 53 79 6e 63 65 64 20 76 61 72 69 61 62 6c  stSynced variabl
6f10: 65 0a 2a 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d  e.** and, if mem
6f20: 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
6f30: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20 73  s enabled, the s
6f40: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6f50: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 0a 2a  t.pFirstSynced.*
6f60: 2a 20 76 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e  * variable also.
6f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6f80: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
6f90: 79 6e 63 65 64 28 50 61 67 65 72 20 2a 70 50 61  ynced(Pager *pPa
6fa0: 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ger){.  pPager->
6fb0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
6fc0: 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70   = pPager->lru.p
6fd0: 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51  First;.#ifdef SQ
6fe0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6ff0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
7000: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
7010: 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  Db ){.    PgHdr 
7020: 2a 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  *p;.    sqlite3_
7030: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
7040: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
7050: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
7060: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66  TIC_LRU));.    f
7070: 6f 72 28 70 3d 73 71 6c 69 74 65 33 4c 72 75 50  or(p=sqlite3LruP
7080: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 20  ageList.pFirst; 
7090: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
70a0: 3b 20 70 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65  ; p=p->gfree.pNe
70b0: 78 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xt);.    assert(
70c0: 70 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  p==pPager->lru.p
70d0: 46 69 72 73 74 53 79 6e 63 65 64 20 7c 7c 20 70  FirstSynced || p
70e0: 3d 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  ==sqlite3LruPage
70f0: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
7100: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4c  d);.    sqlite3L
7110: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
7120: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
7130: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7140: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
7150: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
7160: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
7170: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ));.  }.#endif.}
7180: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7190: 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50 67  rue if page *pPg
71a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
71b0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
71c0: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f   statement.** jo
71d0: 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65 6d  urnal (or statem
71e0: 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61 73  ent snapshot has
71f0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
7200: 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a 2a  f *pPg is part.*
7210: 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  * of an in-memor
7220: 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a  y database)..*/.
7230: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
7240: 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64 72  nStatement(PgHdr
7250: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
7260: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
7270: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d  Pager;.  if( MEM
7280: 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  DB ){.    return
7290: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
72a0: 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e 53  Pg, pPager)->inS
72b0: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
72c0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
72d0: 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
72e0: 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
72f0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
7300: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7310: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
7320: 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  r hash table to 
7330: 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20  N.  N must be a 
7340: 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e  power.** of two.
7350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7360: 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
7370: 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70  h_table(Pager *p
7380: 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20  Pager, int N){. 
7390: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20   PgHdr **aHash, 
73a0: 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20  *pPg;.  assert( 
73b0: 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29  N>0 && (N&(N-1))
73c0: 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ==0 );.#ifdef SQ
73d0: 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54  LITE_MALLOC_SOFT
73e0: 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20 4e 2a 73  _LIMIT.  if( N*s
73f0: 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3e  izeof(aHash[0])>
7400: 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f  SQLITE_MALLOC_SO
7410: 46 54 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  FT_LIMIT ){.    
7420: 4e 20 3d 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  N = SQLITE_MALLO
7430: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 2f 73 69 7a  C_SOFT_LIMIT/siz
7440: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 3b 0a 20  eof(aHash[0]);. 
7450: 20 7d 0a 20 20 69 66 28 20 4e 3d 3d 70 50 61 67   }.  if( N==pPag
7460: 65 72 2d 3e 6e 48 61 73 68 20 29 20 72 65 74 75  er->nHash ) retu
7470: 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67  rn;.#endif.  pag
7480: 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
7490: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
74a0: 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69 74 65  Hash!=0 ) sqlite
74b0: 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67  3FaultBeginBenig
74c0: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
74d0: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
74e0: 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65    aHash = sqlite
74f0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
7500: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
7510: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
7520: 3e 61 48 61 73 68 21 3d 30 20 29 20 73 71 6c 69  >aHash!=0 ) sqli
7530: 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67  te3FaultEndBenig
7540: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
7550: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
7560: 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
7570: 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73  ger);.  if( aHas
7580: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
7590: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
75a0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
75b0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
75c0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
75d0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
75e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
75f0: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
7600: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
7610: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
7620: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
7630: 0a 20 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c  .  pagerMutexHel
7640: 64 28 70 50 61 67 65 72 29 3b 0a 20 20 66 6f 72  d(pPager);.  for
7650: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
7660: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
7670: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
7680: 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70  int h;.    if( p
7690: 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
76a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
76b0: 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
76c0: 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
76d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ==0 );.      con
76e0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
76f0: 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
7700: 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d   (N-1);.    pPg-
7710: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61  >pNextHash = aHa
7720: 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61  sh[h];.    if( a
7730: 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20  Hash[h] ){.     
7740: 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76   aHash[h]->pPrev
7750: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
7760: 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d  }.    aHash[h] =
7770: 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70   pPg;.    pPg->p
7780: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
7790: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
77a0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
77b0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
77c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
77d0: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
77e0: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
77f0: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
7800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
7810: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
7820: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
7830: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
7840: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7850: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
7860: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
7870: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
7880: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
7890: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
78a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
78b0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
78c0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
78d0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
78e0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
78f0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
7900: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
7910: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
7920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7930: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
7940: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
7950: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7960: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
7970: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
7980: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
7990: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
79a0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
79b0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
79c0: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
79d0: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
79e0: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
79f0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
7a00: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
7a10: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
7a20: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
7a30: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
7a40: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
7a50: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
7a60: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
7a70: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
7a80: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
7a90: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
7aa0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
7ab0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
7ac0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
7ad0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
7ae0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
7af0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
7b00: 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46  /*.** If file pF
7b10: 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20  d is open, call 
7b20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7b30: 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  ) on it..*/.stat
7b40: 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28  ic int osUnlock(
7b50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
7b60: 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  d, int eLock){. 
7b70: 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68   if( !pFd->pMeth
7b80: 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
7b90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
7ba0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
7bb0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65  3OsUnlock(pFd, e
7bc0: 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
7bd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
7be0: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
7bf0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
7c00: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
7c10: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
7c20: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
7c30: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
7c40: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
7c50: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
7c60: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
7c70: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
7c80: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
7c90: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
7ca0: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
7cb0: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
7cc0: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
7cd0: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
7ce0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7cf0: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
7d00: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
7d10: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
7d20: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
7d30: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
7d40: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
7d50: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
7d60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
7d70: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
7d80: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
7d90: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
7da0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
7db0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
7dc0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
7dd0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
7de0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
7df0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
7e00: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
7e10: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
7e20: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
7e30: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
7e40: 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20  ){.  int dc;    
7e50: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
7e60: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
7e70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f   */.  int nSecto
7e80: 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f  r;      /* Secto
7e90: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  r size */.  int 
7ea0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a  nPage;        /*
7eb0: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   Page size */.  
7ec0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7ed0: 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a   = pPager->fd;..
7ee0: 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f    if( fd->pMetho
7ef0: 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73  ds ){.    dc = s
7f00: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7f10: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66 64  aracteristics(fd
7f20: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
7f30: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
7f40: 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e 50  Size(fd);.    nP
7f50: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
7f60: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61  geSize;.  }..  a
7f70: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
7f80: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
7f90: 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65 72  12>>8));.  asser
7fa0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
7fb0: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
7fc0: 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20 21 66  >>8));..  if( !f
7fd0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20 28  d->pMethods || (
7fe0: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
7ff0: 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e 3e  _ATOMIC|(nPage>>
8000: 38 29 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e 50  8))&&nSector<=nP
8010: 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  age) ){.    retu
8020: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
8030: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
8040: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
8050: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8060: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
8070: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
8080: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
8090: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
80a0: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
80b0: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
80c0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
80d0: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
80e0: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
80f0: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
8100: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
8110: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
8120: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
8130: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
8140: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
8150: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
8160: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
8170: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
8180: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
8190: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
81a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
81b0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
81c0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
81d0: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
81e0: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
81f0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
8200: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
8210: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
8220: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
8230: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
8240: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
8250: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
8260: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
8270: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
8280: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
8290: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
82a0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
82b0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
82c0: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
82d0: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
82e0: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
82f0: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
8300: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
8310: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8320: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
8330: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
8340: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
8350: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
8360: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65  ent error occure
8370: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
8380: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
8390: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
83a0: 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74  eplayed..*/.stat
83b0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
83c0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
83d0: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  er);.static int 
83e0: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
83f0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
8400: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
8410: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
8420: 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
8430: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
8440: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
8450: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
8460: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
8470: 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
8480: 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
8490: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
84a0: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
84b0: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
84c0: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
84d0: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
84e0: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
84f0: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
8500: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
8510: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
8520: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
8530: 4e 4c 4f 43 4b 20 26 26 20 70 50 61 67 65 72 2d  NLOCK && pPager-
8540: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8550: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
8560: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
8570: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
8580: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
8590: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
85a0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
85b0: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
85c0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
85d0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
85e0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
85f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
8600: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
8610: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
8620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8630: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
8640: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
8650: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
8660: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
8670: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
8680: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
8690: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
86a0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
86b0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
86c0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
86d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
86e0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
86f0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
8700: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
8710: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
8720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
8730: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
8740: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
8750: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
8760: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
8770: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
8780: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
8790: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
87a0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
87b0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
87c0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
87d0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
87e0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
87f0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
8800: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
8810: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
8820: 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Size, .         
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
8840: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
8850: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
8860: 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
8870: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
8880: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
8890: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
88a0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
88b0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
88c0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
88d0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
88e0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
88f0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
8900: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
8910: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
8920: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
8930: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
8940: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
8950: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
8960: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
8970: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
8980: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
8990: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
89a0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
89b0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
89c0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
89d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
89e0: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
89f0: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
8a00: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
8a10: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
8a20: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
8a30: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64  .#define pager_d
8a40: 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a  atahash(X,Y)  0.
8a50: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61  #define pager_pa
8a60: 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65  gehash(X)  0.#de
8a70: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
8a80: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
8a90: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
8aa0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
8ab0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
8ac0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
8ad0: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
8ae0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8af0: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
8b00: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
8b10: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
8b20: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
8b30: 79 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68  y supplied by th
8b40: 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a  e caller. .**.**
8b50: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
8b60: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
8b70: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
8b80: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
8b90: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
8ba0: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
8bb0: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
8bc0: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
8bd0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
8be0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
8bf0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
8c00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
8c10: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
8c20: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
8c30: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
8c40: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
8c50: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
8c60: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
8c70: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
8c80: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
8c90: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
8ca0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8cb0: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
8cc0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
8cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
8ce0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8cf0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
8d00: 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  t zMaster[0] is 
8d10: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
8d20: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
8d30: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8d40: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
8d50: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
8d60: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
8d70: 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73  Master, int nMas
8d80: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
8d90: 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34    u32 len;.  i64
8da0: 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75   szJ;.  u32 cksu
8db0: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  m;.  int i;.  un
8dc0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
8dd0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
8de0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
8df0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
8e00: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
8e10: 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  \0';..  rc = sql
8e20: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
8e30: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  Jrnl, &szJ);.  i
8e40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8e50: 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74   || szJ<16 ) ret
8e60: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
8e70: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
8e80: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b  , szJ-16, &len);
8e90: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8ea0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8eb0: 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d  ;..  if( len>=nM
8ec0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
8ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8ee0: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
8ef0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
8f00: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  -12, &cksum);.  
8f10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8f20: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
8f30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8f40: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
8f50: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20  ic, 8, szJ-8);. 
8f60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8f70: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
8f80: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
8f90: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
8fa0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
8fb0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
8fc0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
8fd0: 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66  zJ-16-len);.  if
8fe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9000: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
9010: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  len] = '\0';..  
9020: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
9030: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
9040: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9050: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
9060: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
9070: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
9080: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a  Master[i];.   }.
9090: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
90a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
90b0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
90c0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
90d0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
90e0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
90f0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
9100: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9110: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
9120: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
9130: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
9140: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
9150: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
9160: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
9170: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
9180: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
9190: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
91a0: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d  /.    zMaster[0]
91b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20   = '\0';.  }.   
91c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
91d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
91e0: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
91f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
9200: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
9210: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
9220: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
9230: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
9240: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
9250: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
9260: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
9270: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
9280: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
9290: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
92a0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
92b0: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
92c0: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
92d0: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9300: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
9340: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
9390: 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75  tic void seekJou
93a0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
93b0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
93c0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
93d0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
93e0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
93f0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
9400: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
9410: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
9420: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
9430: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
9440: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9450: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
9460: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
9470: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
9480: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
9490: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
94a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
94b0: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
94c0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
94d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
94e0: 74 65 20 7a 65 72 6f 73 20 6f 76 65 72 20 74 68  te zeros over th
94f0: 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
9500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
9510: 68 69 73 20 68 61 73 20 74 68 65 0a 2a 2a 20 65  his has the.** e
9520: 66 66 65 63 74 20 6f 66 20 69 6e 76 61 6c 69 64  ffect of invalid
9530: 61 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ating the journa
9540: 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69  l file and commi
9550: 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61  tting the.** tra
9560: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
9570: 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72  tic int zeroJour
9580: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
9590: 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e  ager, int doTrun
95a0: 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  cate){.  int rc 
95b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
95c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
95d0: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20   zeroHdr[28];.. 
95e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
95f0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 49  rnalOff ){.    I
9600: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
9610: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
9620: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
9630: 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63  cate ){.      rc
9640: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
9650: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
9660: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9670: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9680: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9690: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
96a0: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
96b0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
96c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
96d0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
96e0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
96f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
9700: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
9710: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
9720: 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  gs);.    }.  }. 
9730: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9740: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9750: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9760: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
9770: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
9780: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
9790: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
97a0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
97b0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
97c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
97d0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
97e0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
97f0: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
9800: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9810: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
9820: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
9830: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
9840: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
9850: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
9860: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
9870: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
9880: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
9890: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
98a0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
98b0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
98c0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
98d0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
98e0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
98f0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
9900: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
9910: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
9920: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
9930: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
9940: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
9950: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
9960: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
9970: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9980: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
9990: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
99a0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
99b0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
99c0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
99d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
99e0: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
99f0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
9a00: 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20  ;.  int nHeader 
9a10: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
9a20: 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65  ze;.  int nWrite
9a30: 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  ;..  if( nHeader
9a40: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
9a50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
9a60: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
9a70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
9a80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
9a90: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
9aa0: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
9ab0: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
9ac0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9ad0: 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75  ;.  }..  seekJou
9ae0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
9af0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9b00: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
9b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d  journalOff;..  m
9b20: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
9b30: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
9b40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9b50: 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ic));..  /* .  *
9b60: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
9b70: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
9b80: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
9b90: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
9ba0: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
9bb0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
9bc0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
9bd0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
9be0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
9bf0: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
9c00: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
9c10: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9c20: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
9c30: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
9c40: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
9c50: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
9c60: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
9c70: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
9c80: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
9c90: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
9ca0: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
9cb0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
9cc0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
9cd0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
9ce0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
9cf0: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
9d00: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
9d10: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
9d20: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
9d30: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
9d40: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
9d50: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9d60: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9d70: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
9d80: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
9d90: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
9da0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20  failure occured 
9db0: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
9dc0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9dd0: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
9de0: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
9df0: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
9e00: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
9e10: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
9e20: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
9e30: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
9e40: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
9e50: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
9e60: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
9e70: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
9e80: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
9e90: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
9ea0: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
9eb0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
9ec0: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
9ed0: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
9ee0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
9ef0: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
9f00: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
9f10: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
9f20: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
9f30: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
9f40: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
9f50: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
9f60: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a  Pager->noSync);.
9f70: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e    if( (pPager->n
9f80: 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73  oSync) .   || (s
9f90: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
9fa0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
9fb0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
9fc0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
9fd0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
9fe0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9ff0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a000: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
a010: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
a020: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
a030: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
a040: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
a050: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
a060: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
a070: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
a080: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
a090: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
a0a0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
a0b0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
a0c0: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
a0d0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
a0e0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
a0f0: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
a100: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
a110: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
a120: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
a130: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
a140: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a150: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
a160: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
a170: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
a180: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
a190: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
a1a0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
a1b0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a1c0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
a1d0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
a1e0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
a1f0: 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b  journalHdr==0 ){
a200: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
a210: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74   size */.    put
a220: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
a230: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
a240: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
a250: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a260: 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  }..  for(nWrite=
a270: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
a280: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
a290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
a2a0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
a2b0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
a2c0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
a2d0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
a2e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
a2f0: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
a300: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
a310: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
a320: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
a330: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
a340: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
a350: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a360: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
a370: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a380: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
a390: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
a3a0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
a3b0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
a3c0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
a3d0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
a3e0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
a3f0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
a400: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
a410: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
a420: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
a430: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
a440: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
a450: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
a460: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
a470: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
a480: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
a490: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
a4a0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
a4b0: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
a4c0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
a4d0: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
a4e0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
a4f0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
a500: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
a510: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
a520: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a530: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a540: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a550: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a560: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a570: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a580: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a590: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a5a0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a5b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a5c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a5d0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a5e0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a5f0: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a600: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a610: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a620: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a630: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a640: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a650: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a660: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a670: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a680: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a690: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a6a0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a6b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a6c0: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a6d0: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a6e0: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a6f0: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a700: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a710: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a720: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a730: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a740: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a750: 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69  f;.  int iPageSi
a760: 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e  ze;..  seekJourn
a770: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
a780: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
a790: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
a7a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
a7b0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
a7c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a7d0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72  E_DONE;.  }.  jr
a7e0: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
a7f0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72  journalOff;..  r
a800: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a810: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
a820: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
a830: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
a840: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a850: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
a860: 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69   += sizeof(aMagi
a870: 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  c);..  if( memcm
a880: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
a890: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
a8a0: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
a8b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a8c0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
a8d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a8e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
a8f0: 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66  ff, pNRec);.  if
a900: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a910: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a920: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a930: 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50  , jrnlOff+4, &pP
a940: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
a950: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a960: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
a970: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a980: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
a990: 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  8, pDbSize);.  i
a9a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a9b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a9c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a9d0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28  d, jrnlOff+16, (
a9e0: 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65  u32 *)&iPageSize
a9f0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
aa00: 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50  ITE_OK .   && iP
aa10: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20  ageSize>=512 .  
aa20: 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53   && iPageSize<=S
aa30: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
aa40: 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50 61  IZE .   && ((iPa
aa50: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
aa60: 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ize)==0 .  ){.  
aa70: 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d    u16 pagesize =
aa80: 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20   iPageSize;.    
aa90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
aaa0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
aab0: 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b  ger, &pagesize);
aac0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
aad0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
aae0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
aaf0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
ab00: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
ab10: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
ab20: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ab30: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
ab40: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
ab50: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
ab60: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
ab70: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
ab80: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
ab90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
aba0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
abb0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
abc0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
abd0: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
abe0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
abf0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
ac00: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
ac10: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
ac20: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
ac30: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ac40: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
ac50: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
ac60: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
ac70: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ac80: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
ac90: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
aca0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
acb0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
acc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
acd0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
ace0: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
acf0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
ad00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ad10: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
ad20: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
ad30: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
ad40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ad50: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
ad60: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
ad70: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
ad80: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
ad90: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
ada0: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
adb0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
adc0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
add0: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
ade0: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
adf0: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
ae00: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
ae10: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
ae20: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
ae30: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
ae40: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
ae50: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
ae60: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
ae70: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
ae80: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
ae90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
aea0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
aeb0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
aec0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
aed0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
aee0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
aef0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
af00: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
af10: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
af20: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
af30: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
af40: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
af50: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
af60: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
af70: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
af80: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
af90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
afa0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
afb0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
afc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
afd0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
afe0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
aff0: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
b000: 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c  lOff;.  i64 jrnl
b010: 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73 75  Size;.  u32 cksu
b020: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
b030: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
b040: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
b050: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
b060: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
b070: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
b080: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
b090: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
b0a0: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
b0b0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
b0c0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
b0d0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
b0e0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
b0f0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
b100: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
b110: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
b120: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
b130: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
b140: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b150: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
b160: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
b170: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
b180: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
b190: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
b1a0: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
b1b0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
b1c0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
b1d0: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
b1e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
b1f0: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
b200: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
b210: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b220: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
b230: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
b240: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
b250: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
b260: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
b270: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b280: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b290: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
b2a0: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
b2b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b2c0: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
b2d0: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
b2e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b2f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b300: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
b310: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
b320: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
b330: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
b340: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
b350: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
b360: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
b370: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
b380: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
b390: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b3a0: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
b3b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b3c0: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
b3d0: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69   jrnlOff += 8+si
b3e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b3f0: 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ic);.  pPager->n
b400: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
b410: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
b420: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
b430: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
b440: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
b450: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
b460: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
b470: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
b480: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b490: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b4a0: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
b4b0: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
b4c0: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
b4d0: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
b4e0: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
b4f0: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
b500: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
b510: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
b520: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
b530: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
b540: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
b550: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
b560: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
b570: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b580: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
b590: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
b5a0: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
b5b0: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
b5c0: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
b5d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
b5e0: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
b5f0: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
b600: 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51  / .  if( (rc==SQ
b610: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28  LITE_OK).   && (
b620: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b630: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b640: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d  fd, &jrnlSize))=
b650: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
b660: 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66   jrnlSize>jrnlOf
b670: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
b680: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b690: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  e(pPager->jfd, j
b6a0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  rnlOff);.  }.  r
b6b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b6c0: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
b6d0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
b6e0: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
b6f0: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
b700: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
b710: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
b720: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
b730: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
b740: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
b750: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
b760: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b770: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
b780: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50  lps the sqlite3P
b790: 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29  agerStmtCommit()
b7a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
b7b0: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
b7c0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
b7d0: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
b7e0: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
b7f0: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
b800: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
b810: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
b820: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
b830: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
b840: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
b850: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
b860: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
b870: 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72  ager;.  PgHistor
b880: 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
b890: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
b8a0: 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
b8b0: 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20   MEMDB );.  if( 
b8c0: 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29  !pHist->inStmt )
b8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48  {.    assert( pH
b8e0: 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  ist->pPrevStmt==
b8f0: 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78  0 && pHist->pNex
b900: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tStmt==0 );.    
b910: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
b920: 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52  t ){.      PGHDR
b930: 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d  _TO_HIST(pPager-
b940: 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d  >pStmt, pPager)-
b950: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
b960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73  ;.    }.    pHis
b970: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
b980: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20  Pager->pStmt;.  
b990: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
b9a0: 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74  = pPg;.    pHist
b9b0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
b9c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  }.}../*.** Find 
b9d0: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
b9e0: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
b9f0: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
ba00: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
ba10: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
ba20: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
ba30: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
ba40: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
ba50: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
ba60: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
ba70: 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66    PgHdr *p;.  if
ba80: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d  ( pPager->aHash=
ba90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
baa0: 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61   p = pPager->aHa
bab0: 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65  sh[pgno & (pPage
bac0: 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20  r->nHash-1)];.  
bad0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70  while( p && p->p
bae0: 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  gno!=pgno ){.   
baf0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73   p = p->pNextHas
bb00: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
bb10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  p;.}../*.** Clea
bb20: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
bb30: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
bb40: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
bb50: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
bb60: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
bb70: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
bb80: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
bb90: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
bba0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
bbb0: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
bbc0: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
bbd0: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
bbe0: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
bbf0: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
bc00: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
bc10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
bc20: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
bc30: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
bc40: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
bc50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bc60: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
bc70: 20 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c 64    pagerMutexHeld
bc80: 28 70 50 61 67 65 72 29 3b 0a 20 20 66 6f 72 28  (pPager);.  for(
bc90: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
bca0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
bcb0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
bcc0: 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
bcd0: 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
bce0: 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52  gno));.    PAGER
bcf0: 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
bd00: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
bd10: 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  );.    pNext = p
bd20: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
bd30: 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
bd40: 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPg);.    sqlite
bd50: 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74  3_free(pPg->pDat
bd60: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  a);.    sqlite3_
bd70: 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  free(pPg);.  }. 
bd80: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
bd90: 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a  lru.pFirst==0);.
bda0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
bdb0: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
bdc0: 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  d==0);.  assert(
bdd0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73  pPager->lru.pLas
bde0: 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  t==0);.  pPager-
bdf0: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  >pStmt = 0;.  pP
be00: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
be10: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
be20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
be30: 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c  nHash = 0;.  sql
be40: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
be50: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
be60: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
be70: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
be80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
be90: 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ef = 0;.}../*.**
bea0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
beb0: 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
bec0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
bed0: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
bee0: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
bef0: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
bf00: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
bf10: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
bf20: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
bf30: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
bf40: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
bf50: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
bf60: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
bf70: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
bf80: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
bf90: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
bfa0: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
bfb0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
bfc0: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
bfd0: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
bfe0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
bff0: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
c000: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c010: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
c020: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
c030: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c040: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
c050: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
c060: 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e     int rc = osUn
c070: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c080: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
c090: 20 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72   if( rc ) pPager
c0a0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
c0b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
c0c0: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20  Size = -1;.     
c0d0: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
c0e0: 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
c0f0: 29 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61  )..      /* Alwa
c100: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
c110: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
c120: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
c130: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  base lock..     
c140: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
c150: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
c160: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
c170: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
c180: 0a 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  .      ** delete
c190: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
c1a0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
c1b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c1c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c1d0: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pen ){.        s
c1e0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c1f0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c200: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c210: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
c220: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
c230: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
c240: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
c250: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
c260: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
c270: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
c280: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
c290: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
c2a0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
c2b0: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
c2c0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75   be.      ** tru
c2d0: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
c2e0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
c2f0: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
c300: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
c310: 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61       ** cache ca
c320: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
c330: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
c340: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
c350: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c360: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
c370: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
c380: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c390: 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  K ) pPager->errC
c3a0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
c3b0: 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
c3c0: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
c3d0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
c3e0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
c3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
c400: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
c410: 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tfd);.          
c420: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
c430: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
c440: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
c450: 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
c460: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
c470: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c480: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
c490: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
c4a0: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
c4b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c4c0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
c4d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c4e0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c4f0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c500: 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
c510: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
c520: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
c530: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
c540: 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
c550: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
c560: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
c570: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
c580: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
c590: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67  LOCK;.      pPag
c5a0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
c5b0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  one = 0;.    }. 
c5c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
c5d0: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
c5e0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c5f0: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
c600: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
c610: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
c620: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
c630: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
c640: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a   error state, .*
c650: 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * do not attempt
c660: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
c670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c680: 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
c690: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a  back(Pager *p){.
c6a0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e    /* assert( p->
c6b0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
c6c0: 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72  ERVED || p->jour
c6d0: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f  nalOpen==0 ); */
c6e0: 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64  .  if( p->errCod
c6f0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e==SQLITE_OK && 
c700: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
c710: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c720: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 67 69  sqlite3FaultBegi
c730: 6e 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 20  nBenign(-1);.   
c740: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
c750: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71  lback(p);.    sq
c760: 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e  lite3FaultEndBen
c770: 69 67 6e 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 70  ign(-1);.  }.  p
c780: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a  ager_unlock(p);.
c790: 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
c7a0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
c7b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
c7c0: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
c7d0: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
c7e0: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
c7f0: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
c800: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
c810: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
c820: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
c830: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c840: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
c850: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
c860: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
c870: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
c880: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
c890: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
c8a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c8b0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
c8c0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
c8d0: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
c8e0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
c8f0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
c900: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
c910: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c920: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
c930: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
c940: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
c950: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
c960: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
c970: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
c980: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
c990: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
c9a0: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
c9b0: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
c9c0: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
c9d0: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
c9e0: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
c9f0: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
ca00: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
ca10: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
ca20: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
ca30: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
ca40: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
ca50: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
ca60: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
ca70: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
ca80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ca90: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
caa0: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
cab0: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
cac0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
cad0: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
cae0: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
caf0: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
cb00: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
cb10: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
cb20: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
cb30: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
cb40: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
cb50: 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 50 67  hasMaster){.  Pg
cb60: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
cb70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cb80: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
cb90: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
cba0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
cbb0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
cbc0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
cbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cbe0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
cbf0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
cc00: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
cc10: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
cc20: 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
cc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
cc40: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
cc50: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
cc60: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
cc70: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
cc80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
cc90: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
cca0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
ccb0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
ccc0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cce0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccf0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cd00: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
cd10: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd20: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd30: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd40: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd80: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
cda0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
cdb0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
cdc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
cdd0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
cde0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cdf0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ce00: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
ce10: 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
ce20: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
ce30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ce40: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
ce50: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ce60: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ce70: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
ce80: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 61 67  nal = 0;.    pag
ce90: 65 72 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  erMutexHeld(pPag
cea0: 65 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  er);.    for(pPg
ceb0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
cec0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
ced0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
cee0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
cef0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
cf00: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
cf10: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
cf20: 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61  .      pPg->alwa
cf30: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
cf40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
cf50: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
cf60: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
cf70: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cf80: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
cf90: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
cfa0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
cfb0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
cfc0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
cfd0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
cfe0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
cff0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
d000: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  nal==0 );.  }.. 
d010: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
d020: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
d030: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
d040: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
d050: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
d060: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
d070: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
d080: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
d090: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
d0a0: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
d0b0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
d0c0: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
d0d0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
d0e0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
d0f0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
d100: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
d110: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c  eedSync = 0;.  l
d120: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
d130: 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
d140: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
d150: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64   -1;.  pPager->d
d160: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
d170: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
d180: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
d190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
d1a0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
d1b0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
d1c0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
d1d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
d1e0: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
d1f0: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
d200: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d210: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d220: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
d230: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
d240: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
d250: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
d260: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
d270: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
d280: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
d290: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
d2a0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
d2b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
d2c0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
d2d0: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
d2e0: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
d2f0: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
d300: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
d310: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
d320: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
d330: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d340: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d350: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d360: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
d370: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
d380: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
d390: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
d3a0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
d3b0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
d3c0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
d3d0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
d3e0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
d3f0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
d400: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
d410: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
d420: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
d430: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
d440: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
d450: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
d460: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
d470: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
d480: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
d490: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
d4a0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
d4b0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
d4c0: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
d4d0: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
d4e0: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
d4f0: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
d500: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
d510: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
d520: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
d530: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
d540: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
d550: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
d560: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
d570: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
d580: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
d590: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
d5a0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
d5b0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
d5c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
d5d0: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
d5e0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
d5f0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
d600: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
d610: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
d620: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
d630: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
d640: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
d650: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
d660: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f   cksum;.}../* Fo
d670: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
d680: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
d690: 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
d6a0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  *);../*.** Read 
d6b0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d6c0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
d6d0: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
d6e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
d6f0: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
d700: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
d710: 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d  *.** If useCksum
d720: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
d730: 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  s journal does n
d740: 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73  ot use checksums
d750: 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  .  Checksums.** 
d760: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
d770: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d780: 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65  ls because state
d790: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f  ment journals do
d7a0: 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20   not.** need to 
d7b0: 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61  survive power fa
d7c0: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
d7d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
d7e0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
d7f0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
d800: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d810: 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66 73  *jfd,.  i64 offs
d820: 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b 73  et,.  int useCks
d830: 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  um.){.  int rc;.
d840: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
d870: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
d880: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
d8b0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
d8c0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
d8d0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8f0: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
d900: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
d910: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
d920: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
d930: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
d940: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
d950: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
d960: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
d970: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
d980: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
d990: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
d9a0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
d9b0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
d9c0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
d9d0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
d9e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
d9f0: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
da00: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
da10: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
da20: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
da30: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
da40: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
da50: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
da60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
da70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
da80: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
da90: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
daa0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
dab0: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
dac0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
dad0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
dae0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
daf0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
db00: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
db10: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
db20: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
db30: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
db40: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
db50: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
db60: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
db70: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
db80: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
db90: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
dba0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
dbb0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
dbc0: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
dbd0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
dbe0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
dbf0: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
dc00: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
dc10: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
dc20: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
dc30: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
dc40: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
dc50: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
dc60: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
dc70: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
dc80: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
dc90: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
dca0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
dcb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dcc0: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
dcd0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
dce0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
dcf0: 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
dd00: 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
dd10: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
dd20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
dd30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dd40: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
dd50: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
dd60: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
dd70: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
dd80: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
dd90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
dda0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
ddb0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
ddc0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
ddd0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
dde0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
ddf0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
de00: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
de10: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
de20: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
de30: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
de40: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
de50: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
de60: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
de70: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
de80: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
de90: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
dea0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
deb0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
dec0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
ded0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
dee0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
def0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
df00: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
df10: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
df20: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
df30: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
df40: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
df50: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
df60: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
df70: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
df80: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
df90: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
dfa0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
dfb0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
dfc0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
dfd0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
dfe0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
dff0: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e000: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e010: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e020: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e030: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e040: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e050: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e060: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e070: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
e080: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
e090: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
e0a0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
e0b0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
e0c0: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
e0d0: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
e0e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e0f0: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
e100: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
e110: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
e120: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
e130: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
e140: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e160: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
e170: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
e180: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
e190: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
e1a0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
e1b0: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
e1c0: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
e1d0: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
e1e0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
e1f0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
e200: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
e210: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
e220: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
e230: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
e240: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
e250: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
e260: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
e270: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
e280: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
e290: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
e2a0: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
e2b0: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
e2c0: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
e2d0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e2e0: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
e2f0: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
e300: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
e310: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
e320: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
e330: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
e340: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
e350: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
e360: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
e370: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
e380: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
e390: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
e3a0: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
e3b0: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
e3c0: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
e3d0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
e3e0: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
e3f0: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
e400: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
e410: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
e420: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
e430: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
e440: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
e450: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
e460: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
e470: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
e480: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
e490: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
e4a0: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
e4b0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
e4c0: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
e4d0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
e4e0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
e4f0: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
e500: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
e510: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
e520: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
e530: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
e540: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
e550: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
e560: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
e570: 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE4("PLAYBACK %d
e580: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
e590: 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
e5a0: 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
e5b0: 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
e5c0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
e5d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61  ger->pageSize, a
e5e0: 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50  Data));.  if( pP
e5f0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e600: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
e610: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
e620: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20 20 20  needSync==0).   
e630: 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
e640: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
e650: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
e660: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
e670: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
e680: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e690: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
e6a0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
e6b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
e6c0: 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70  fset);.    if( p
e6d0: 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65  Pg ){.      make
e6e0: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
e6f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  }.  }.  if( pPg 
e700: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
e710: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
e720: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
e730: 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
e740: 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
e750: 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
e760: 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
e770: 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
e780: 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
e790: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
e7a0: 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
e7b0: 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
e7c0: 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
e7d0: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
e7e0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
e7f0: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
e800: 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
e810: 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
e820: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
e830: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
e840: 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
e850: 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73  pData;.    /* as
e860: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
e870: 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d  =0 || pPg->pgno=
e880: 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61  =1 ); */.    pDa
e890: 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
e8a0: 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d  TA(pPg);.    mem
e8b0: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
e8c0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
e8d0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
e8e0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
e8f0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
e900: 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70  xReiniter(pPg, p
e910: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e920: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e930: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
e940: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
e950: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
e960: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
e970: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
e980: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
e990: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
e9a0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
e9b0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
e9c0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
e9d0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
e9e0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
e9f0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
ea00: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
ea10: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
ea20: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
ea30: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
ea40: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
ea50: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
ea60: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
ea70: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
ea80: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
ea90: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
eaa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
eab0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
eac0: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
ead0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
eae0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
eaf0: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
eb00: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
eb10: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
eb20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
eb30: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
eb40: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
eb50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eb60: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
eb70: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
eb80: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
eb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
eba0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
ebb0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
ebc0: 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
ebd0: 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
ebe0: 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
ebf0: 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
ec00: 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
ec10: 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
ec20: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
ec30: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
ec40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
ec50: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
ec60: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
ec70: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
ec80: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
ec90: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
eca0: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
ecb0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
ecc0: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
ecd0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
ece0: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
ecf0: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
ed00: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
ed10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
ed20: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
ed30: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
ed40: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
ed50: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
ed60: 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
ed70: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
ed80: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
ed90: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
eda0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
edb0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
edc0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
edd0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
ede0: 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74  pMaster;.  sqlit
edf0: 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
ee00: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  l;.  char *zMast
ee10: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
ee20: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
ee30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ee40: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
ee50: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
ee60: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
ee70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ee80: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
ee90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
eea0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
eeb0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
eec0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
eed0: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
eee0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
eef0: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
ef00: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
ef10: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d  rence..  */.  pM
ef20: 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
ef30: 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  _file *)sqlite3_
ef40: 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f  malloc(pVfs->szO
ef50: 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
ef60: 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
ef70: 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
ef80: 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
ef90: 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
efa0: 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
efb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
efc0: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
efd0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
efe0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
eff0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
f000: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
f010: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
f020: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
f030: 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
f040: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
f050: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f060: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
f070: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
f080: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20  er_open = 1;..  
f090: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
f0a0: 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
f0b0: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
f0c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f0d0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
f0e0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
f0f0: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
f100: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
f110: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
f120: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
f130: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
f140: 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72  sterPtr = pPager
f150: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
f160: 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
f170: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
f180: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f190: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
f1a0: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
f1b0: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
f1c0: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
f1d0: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
f1e0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
f1f0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
f200: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
f210: 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  3_malloc(nMaster
f220: 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
f230: 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
f240: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
f250: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f260: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f270: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f280: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
f290: 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
f2a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
f2b0: 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
f2c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f2d0: 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
f2e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
f2f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
f300: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f310: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
f320: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
f330: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
f340: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
f350: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
f360: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
f370: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
f380: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
f390: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
f3a0: 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
f3b0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
f3c0: 53 54 53 29 3b 0a 20 20 20 20 20 20 69 66 28 20  STS);.      if( 
f3d0: 72 63 21 3d 30 20 26 26 20 72 63 21 3d 31 20 29  rc!=0 && rc!=1 )
f3e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
f3f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
f400: 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
f410: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
f420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f430: 20 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20   rc==1 ){.      
f440: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
f450: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
f460: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
f470: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
f480: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
f490: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
f4a0: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
f4b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f4c0: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
f4d0: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
f4e0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
f4f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f500: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
f510: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
f520: 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
f530: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
f540: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
f550: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
f560: 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  AL);.        rc 
f570: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
f580: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
f590: 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
f5a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
f5b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f5c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
f5d0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f5e0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f5f0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
f600: 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
f610: 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
f620: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
f630: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
f640: 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
f650: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f660: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f670: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f680: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f690: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
f6a0: 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
f6b0: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
f6c0: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
f6d0: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ==0;.        if(
f6e0: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
f6f0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
f700: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
f710: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f720: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
f730: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
f740: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f760: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
f770: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
f780: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
f790: 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
f7a0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
f7b0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
f7c0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
f7d0: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
f7e0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
f7f0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
f800: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
f810: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
f820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
f830: 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
f840: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
f850: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
f860: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
f870: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
f880: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
f890: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f  ger *pPager);../
f8a0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
f8b0: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
f8c0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
f8d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
f8e0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
f8f0: 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74  ed. Also truncat
f900: 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70  e the cached rep
f910: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
f920: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d  he file..**.** M
f930: 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
f940: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
f950: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
f960: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61  smaller than nPa
f970: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  ge..** This can 
f980: 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
f990: 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69  ple, if we are i
f9a0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
f9b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
f9c0: 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e   which has exten
f9d0: 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ded the file siz
f9e0: 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61  e and the new pa
f9f0: 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c  ges are still al
fa00: 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63  l held.** in cac
fa10: 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45  he, then an INSE
fa20: 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65  RT or UPDATE doe
fa30: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  s a statement ro
fa40: 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a  llback.  Some.**
fa50: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
fa60: 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
fa70: 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
fa80: 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f  ed if you try to
fa90: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66  .** truncate a f
faa0: 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
fab0: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
fac0: 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c  than it currentl
fad0: 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65  y is,.** so dete
fae0: 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
faf0: 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
fb00: 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68 65  zero byte to the
fb10: 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 0a   end of the new.
fb20: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ** file instead.
fb30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fb40: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
fb50: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
fb60: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
fb70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
fb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
fb90: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
fba0: 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66  IVE && pPager->f
fbb0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
fbc0: 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
fbd0: 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
fbe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
fbf0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
fc00: 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
fc10: 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
fc20: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fc30: 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
fc40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fc50: 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
fc60: 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
fc70: 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
fc80: 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
fc90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
fca0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
fcb0: 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
fcc0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
fcd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fce0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
fcf0: 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c  ager->fd, "", 1,
fd00: 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20   newSize-1);.   
fd10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
fd20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fd30: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
fd40: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
fd50: 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
fd60: 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
fd70: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
fd80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
fd90: 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65  t the sectorSize
fda0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
fdb0: 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ager..**.** The 
fdc0: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
fdd0: 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20 61  t least as big a
fde0: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
fdf0: 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79  e reported.** by
fe00: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
fe10: 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69 6e  Size().  The min
fe20: 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a 65  imum sector size
fe30: 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74   is 512..*/.stat
fe40: 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
fe50: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
fe60: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 70  ger){.  assert(p
fe70: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
fe80: 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
fe90: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
fea0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
feb0: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
fec0: 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
fed0: 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
fee0: 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
fef0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
ff00: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
ff10: 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
ff20: 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65 20   whcih case the 
ff30: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
ff40: 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
ff50: 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f  segfault..    */
ff60: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
ff70: 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
ff80: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
ff90: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20  ager->fd);.  }. 
ffa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
ffb0: 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20  torSize<512 ){. 
ffc0: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
ffd0: 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
ffe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
fff0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
10000 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
10010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10020 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
10030 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
10040 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
10050 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
10060 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
10070 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
10080 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
10090 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
100a0 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
100b0 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
100c0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
100d0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
100e0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
100f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
10100 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
10110 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
10120 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
10130 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
10140 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
10150 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
10160 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
10170 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
10180 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
10190 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
101a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
101b0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
101c0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
101d0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
101e0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
101f0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
10200 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
10210 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10220 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
10230 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
10240 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
10250 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
10260 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
10270 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
10280 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
10290 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
102a0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
102b0 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
102c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
102d0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
102e0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
102f0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
10300 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20  e case..**  (7) 
10310 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
10320 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
10330 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
10340 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10350 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
10360 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
10370 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
10380 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
10390 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
103a0 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
103b0 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f    (8)  N bytes o
103c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
103d0 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
103e0 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
103f0 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
10400 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
10410 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
10420 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10430 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
10440 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
10450 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
10460 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
10470 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
10480 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
10490 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
104a0 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
104b0 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
104c0 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20  *  (9)  Zero or 
104d0 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
104e0 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
104f0 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
10500 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
10510 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
10520 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
10530 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
10540 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
10550 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
10560 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
10570 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
10580 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
10590 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38  mean the first 8
105a0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
105b0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
105c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
105d0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
105e0 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   9th item..**.**
105f0 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
10600 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
10610 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
10620 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
10630 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
10640 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
10650 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
10660 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
10670 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
10680 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
10690 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
106a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
106b0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
106c0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
106d0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
106e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
106f0 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
10700 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
10710 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
10720 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
10730 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
10740 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
10750 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
10760 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
10770 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
10780 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
10790 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
107a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
107b0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
107c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
107d0 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
107e0 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
107f0 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
10800 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
10810 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
10820 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
10830 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
10840 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
10850 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
10860 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
10870 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
10880 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
10890 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
108a0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
108b0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
108c0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
108d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
108e0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
108f0 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
10900 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
10910 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
10920 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
10930 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
10940 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
10950 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
10960 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
10970 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
10980 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
10990 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
109a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
109b0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
109c0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
109d0 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
109e0 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
109f0 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
10a00 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
10a10 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
10a20 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
10a30 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
10a40 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
10a50 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
10a60 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
10a70 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
10a80 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
10a90 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
10aa0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
10ab0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
10ac0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
10ad0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10ae0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
10af0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
10b00 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
10b10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
10b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
10b30 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
10b40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10b50 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
10b60 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
10b70 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
10b80 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
10b90 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10ba0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10bb0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
10bc0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
10bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10be0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
10bf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
10c00 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10c20 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10c30 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
10c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10c50 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
10c60 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
10c70 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10c90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
10ca0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
10cb0 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20 20    int res = 0;  
10cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
10cd0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
10ce0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
10cf0 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
10d00 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
10d10 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
10d20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
10d30 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
10d40 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
10d50 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
10d60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
10d70 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
10d80 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10d90 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
10da0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10db0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
10dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10dd0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10de0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
10df0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10e00 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
10e10 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
10e20 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
10e30 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
10e40 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
10e50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
10e60 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
10e70 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
10e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
10e90 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
10ea0 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
10eb0 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
10ec0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
10ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
10ee0 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
10ef0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
10f00 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
10f10 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
10f20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
10f30 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
10f40 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
10f50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
10f60 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
10f70 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
10f80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10f90 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72  E_OK || (zMaster
10fa0 5b 30 5d 20 0a 20 20 20 26 26 20 28 72 65 73 3d  [0] .   && (res=
10fb0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
10fc0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
10fd0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
10fe0 53 54 53 29 29 3d 3d 30 20 29 20 0a 20 20 29 7b  STS))==0 ) .  ){
10ff0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
11000 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
11010 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 7a  layback;.  }.  z
11020 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
11030 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 72  ( res<0 ){.    r
11040 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
11050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
11060 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
11070 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11080 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  rnalOff = 0;..  
11090 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
110a0 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
110b0 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72  hen the readJour
110c0 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65  nalHdr() call re
110d0 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54  turns.  ** SQLIT
110e0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
110f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
11100 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
11110 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
11120 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
11130 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
11140 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
11150 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
11160 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
11170 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
11180 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
11190 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
111a0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
111b0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
111c0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
111d0 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
111e0 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
111f0 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
11200 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
11210 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
11220 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
11230 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
11240 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
11250 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
11260 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11270 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
11280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11290 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
112a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
112b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
112c0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
112d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
112e0 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
112f0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
11300 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
11310 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
11320 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
11330 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
11340 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
11350 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
11360 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
11370 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
11380 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
11390 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
113a0 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
113b0 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
113c0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
113d0 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
113e0 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
113f0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
11400 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
11410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11420 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
11430 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11440 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
11450 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
11460 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
11470 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
11480 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
11490 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
114a0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
114b0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
114c0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
114d0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
114e0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
114f0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
11500 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
11510 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
11520 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
11530 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
11540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
11550 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
11560 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
11570 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
11580 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
11590 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
115a0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
115b0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
115c0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
115d0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
115e0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
115f0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
11600 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
11610 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
11620 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
11630 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
11640 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
11650 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
11660 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
11670 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
11680 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
11690 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
116a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
116b0 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
116c0 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
116d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
116e0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
116f0 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
11700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
11710 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
11720 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
11730 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
11740 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
11750 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
11760 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
11770 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
11780 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
11790 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
117a0 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
117b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
117c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
117d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
117e0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
117f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
11800 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
11810 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
11820 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
11830 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11840 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
11850 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
11860 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
11870 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
11880 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
11890 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
118a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
118b0 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  f, 1);.      if(
118c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
118d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
118e0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
118f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
11900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
11910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11920 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
11930 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11940 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11950 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
11960 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
11970 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11980 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
11990 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
119a0 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
119b0 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
119c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
119d0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
119e0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
119f0 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
11a00 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
11a10 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
11a20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
11a30 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d  Pathname+1);.  }
11a40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
11a60 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
11a70 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
11a80 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
11a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
11aa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
11ab0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f  ster[0] ){.    /
11ac0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
11ad0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ae0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
11af0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
11b00 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
11b10 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
11b20 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
11b30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
11b40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
11b50 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
11b60 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
11b70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
11b80 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
11b90 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
11ba0 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
11bb0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
11bc0 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
11bd0 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
11be0 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
11bf0 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
11c00 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
11c10 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
11c20 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
11c30 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
11c40 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
11c50 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
11c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11c70 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
11c80 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11c90 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
11ca0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
11cb0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
11cc0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
11cd0 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
11ce0 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
11cf0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
11d00 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
11d10 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
11d20 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
11d30 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
11d40 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
11d50 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
11d60 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
11d70 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
11d80 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
11d90 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
11da0 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
11db0 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
11dc0 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
11dd0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
11de0 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
11df0 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
11e00 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
11e10 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
11e20 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
11e30 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
11e40 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
11e50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11e60 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
11e70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11e80 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
11e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11ea0 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
11eb0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
11ec0 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
11ed0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
11ee0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11ef0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
11f00 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11f10 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11f20 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11f30 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
11f40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11f50 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
11f60 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
11f70 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
11f80 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
11f90 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
11fa0 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
11fb0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
11fc0 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
11fd0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
11fe0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
11ff0 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
12000 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
12010 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
12020 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
12030 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
12040 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
12050 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
12060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12070 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
12080 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
12090 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
120a0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
120b0 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
120c0 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
120d0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
120e0 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
120f0 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
12100 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
12110 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
12120 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
12130 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
12140 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
12150 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
12160 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
12170 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
12180 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
12190 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
121a0 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
121b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
121c0 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
121d0 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
121e0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
121f0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
12200 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
12210 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
12220 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
12230 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
12240 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
12250 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
12260 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
12270 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
12280 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
12290 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
122a0 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
122b0 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
122c0 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
122d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
122e0 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  ec; i++){.    i6
122f0 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b  4 offset = i*(4+
12300 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12310 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
12320 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
12330 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
12340 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
12350 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
12360 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12370 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
12380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
12390 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
123a0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
123b0 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
123c0 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
123d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
123e0 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
123f0 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
12400 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
12410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
12420 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
12430 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
12440 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
12450 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
12460 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
12470 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
12480 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
12490 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
124a0 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
124b0 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
124c0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
124d0 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
124e0 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
124f0 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
12500 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
12510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
12520 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
12530 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12540 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  action..  */.  p
12550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12560 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
12570 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
12580 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
12590 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
125a0 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
125b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
125c0 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
125d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
125e0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
125f0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
12600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12610 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
12620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12630 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
12640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
12650 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
12660 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
12670 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
12680 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
12690 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
126a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
126b0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
126c0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
126d0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
126e0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
126f0 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
12700 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
12710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12720 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12740 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
12750 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
12760 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12770 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
12780 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
12790 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
127a0 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
127b0 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
127c0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
127d0 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
127e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
127f0 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
12800 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
12810 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
12820 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
12830 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
12840 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
12850 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
12860 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
12870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12880 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
12890 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
128a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
128b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
128c0 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
128d0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
128e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
128f0 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
12900 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
12910 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
12920 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
12930 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
12940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12950 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
12960 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
12970 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
12980 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
12990 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
129a0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
129b0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
129c0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
129d0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
129e0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
129f0 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
12a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
12a10 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
12a20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
12a30 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
12a40 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
12a50 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
12a60 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
12a70 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
12a80 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
12a90 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
12aa0 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
12ab0 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
12ac0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
12ad0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
12ae0 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
12af0 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
12b00 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
12b10 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
12b20 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
12b30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12b40 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
12b50 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
12b60 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
12b70 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
12b80 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
12b90 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
12ba0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
12bc0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
12bd0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
12be0 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
12bf0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
12c00 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
12c10 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
12c20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
12c30 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
12c40 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
12c50 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
12c60 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
12c70 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
12c80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
12c90 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
12ca0 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
12cb0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
12cc0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
12cd0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
12ce0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12cf0 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
12d00 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
12d10 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
12d20 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
12d30 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
12d40 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
12d50 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
12d60 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
12d70 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
12d80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12d90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12da0 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
12db0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
12dc0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
12dd0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
12de0 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
12df0 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
12e00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
12e10 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
12e20 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
12e30 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
12e40 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
12e50 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
12e60 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
12e70 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
12e80 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
12ea0 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
12eb0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
12ec0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
12ed0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
12ee0 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
12ef0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
12f00 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
12f10 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
12f20 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
12f30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12f40 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12f50 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
12f60 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
12f70 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
12f80 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
12f90 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
12fa0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
12fb0 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
12fc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12fd0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
12fe0 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
12ff0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
13000 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  e;.  pPager->syn
13010 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f  c_flags = (full_
13020 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  fsync?SQLITE_SYN
13030 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
13040 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
13050 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
13060 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
13070 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
13080 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
13090 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
130a0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
130b0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
130c0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
130d0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
130e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
130f0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
13100 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
13110 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
13120 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
13130 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
13140 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
13150 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
13160 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
13170 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
13180 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ary file. .**.**
13190 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
131a0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
131b0 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
131c0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
131d0 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
131e0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
131f0 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
13200 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
13210 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
13220 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
13230 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
13240 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13250 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
13260 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65  entemp(.  sqlite
13270 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
13280 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
13290 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79 65 72  ile system layer
132a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
132b0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
132c0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
132d0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
132e0 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
132f0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
13300 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 4d   of the file.  M
13310 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
13320 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13330 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
13340 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
13350 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
13360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
13370 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
13380 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
13390 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
133a0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
133b0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
133c0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
133d0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
133e0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
133f0 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
13400 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
13410 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13420 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
13430 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
13440 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
13450 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
13460 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13470 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46 69  OsOpen(pVfs, zFi
13480 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76  lename, pFile, v
13490 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
134a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
134b0 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
134c0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
134d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
134e0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
134f0 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
13500 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
13510 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
13520 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
13530 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
13540 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
13550 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
13560 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
13570 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
13580 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
13590 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
135a0 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
135b0 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
135c0 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
135d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
135e0 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
135f0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
13600 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
13610 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
13620 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
13630 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
13640 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
13650 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
13660 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
13670 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
13680 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
13690 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
136a0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
136b0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
136c0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
136d0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
136e0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
136f0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
13700 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
13710 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
13720 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
13730 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
13740 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
13750 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13760 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
13770 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
13780 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
13790 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
137a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
137b0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
137c0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
137d0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
137e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
137f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
13810 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
13820 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
13830 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
13840 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
13850 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
13860 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13880 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
13890 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
138a0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
138b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
138c0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
138d0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
138e0 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
138f0 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
13900 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
13910 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13920 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
13930 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
13940 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
13950 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
13960 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
13970 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
13980 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
13990 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
139a0 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
139b0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
139c0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
139d0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
139e0 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
139f0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
13a00 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c  );.  int nDefaul
13a10 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44  tPage = SQLITE_D
13a20 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13a30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  ;.  char *zPathn
13a40 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ame;.  int nPath
13a50 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 53  name;.  char *zS
13a60 74 6d 74 4a 72 6e 6c 3b 0a 20 20 69 6e 74 20 6e  tmtJrnl;.  int n
13a70 53 74 6d 74 4a 72 6e 6c 3b 0a 0a 20 20 2f 2a 20  StmtJrnl;..  /* 
13a80 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75  The default retu
13a90 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  rn is a NULL poi
13aa0 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67  nter */.  *ppPag
13ab0 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
13ac0 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70  mpute the full p
13ad0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61  athname */.  nPa
13ae0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
13af0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
13b00 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
13b10 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  e3_malloc(nPathn
13b20 61 6d 65 2a 32 29 3b 0a 20 20 69 66 28 20 7a 50  ame*2);.  if( zP
13b30 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
13b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13b50 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
13b60 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
13b70 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
13b80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13b90 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
13ba0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
13bb0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
13bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
13bd0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
13be0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
13bf0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
13c00 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
13c10 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
13c20 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
13c30 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
13c40 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
13c50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13c70 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
13c80 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
13c90 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  thname);.  }.  i
13ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13cb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13cc0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
13cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13ce0 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20    }.  nPathname 
13cf0 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61  = strlen(zPathna
13d00 6d 65 29 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 74  me);..  /* Put t
13d10 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
13d20 72 6e 61 6c 20 69 6e 20 74 65 6d 70 6f 72 61 72  rnal in temporar
13d30 79 20 64 69 73 6b 20 73 70 61 63 65 20 73 69 6e  y disk space sin
13d40 63 65 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  ce this is.  ** 
13d50 73 6f 6d 65 74 69 6d 65 73 20 52 41 4d 20 64 69  sometimes RAM di
13d60 73 6b 20 6f 72 20 6f 74 68 65 72 20 6f 70 74 69  sk or other opti
13d70 6d 69 7a 65 64 20 73 74 6f 72 61 67 65 2e 20 20  mized storage.  
13d80 55 6e 6c 69 6b 65 6c 79 20 74 68 65 20 6d 61 69  Unlikely the mai
13d90 6e 0a 20 20 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  n.  ** main jour
13da0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 73 74  nal file, the st
13db0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
13dc0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
13dd0 20 62 65 20 0a 20 20 2a 2a 20 63 6f 6c 6f 63 61   be .  ** coloca
13de0 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
13df0 61 62 61 73 65 20 6e 6f 72 20 64 6f 65 73 20 69  abase nor does i
13e00 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 65 72  t need to be per
13e10 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
13e20 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 7a 50 61  zStmtJrnl = &zPa
13e30 74 68 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  thname[nPathname
13e40 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
13e50 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65  te3OsGetTempname
13e60 28 70 56 66 73 2c 20 70 56 66 73 2d 3e 6d 78 50  (pVfs, pVfs->mxP
13e70 61 74 68 6e 61 6d 65 2b 31 2c 20 7a 53 74 6d 74  athname+1, zStmt
13e80 4a 72 6e 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  Jrnl);.  if( rc!
13e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13ea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13eb0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
13ec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
13ed0 6e 53 74 6d 74 4a 72 6e 6c 20 3d 20 73 74 72 6c  nStmtJrnl = strl
13ee0 65 6e 28 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 0a  en(zStmtJrnl);..
13ef0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
13f00 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67  mory for the pag
13f10 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
13f20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
13f30 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
13f40 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72    sizeof(*pPager
13f50 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
13f60 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
13f70 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
13f80 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20  ileSize +       
13f90 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
13fa0 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  al file structur
13fb0 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e  e */ .    pVfs->
13fc0 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20  szOsFile * 3 +  
13fd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
13fe0 6e 20 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75  n db and two jou
13ff0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
14000 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
14010 20 34 30 20 2b 20 20 20 20 20 20 20 20 20 20 2f   40 +          /
14020 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
14030 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
14040 6c 20 2a 2f 0a 20 20 20 20 6e 53 74 6d 74 4a 72  l */.    nStmtJr
14050 6e 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nl              
14060 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 4a 72 6e       /* zStmtJrn
14070 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
14080 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
14090 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
140a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
140b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
140c0 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75  .  }.  pPtr = (u
140d0 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  8 *)&pPager[1];.
140e0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
140f0 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20  gs = vfsFlags;. 
14100 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73   pPager->fd = (s
14110 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
14120 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
14130 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*0];.  pPager->
14140 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  stfd = (sqlite3_
14150 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
14160 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20  ->szOsFile*1];. 
14170 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28   pPager->jfd = (
14180 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
14190 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
141a0 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*2];.  pPager-
141b0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
141c0 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  ar*)&pPtr[pVfs->
141d0 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e  szOsFile*2+journ
141e0 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
141f0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
14200 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
14210 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
14220 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
14230 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
14240 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50  r->zDirectory[nP
14250 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
14260 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20  ager->zStmtJrnl 
14270 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
14280 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30  nal[nPathname+10
14290 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66  ];.  pPager->pVf
142a0 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63  s = pVfs;.  memc
142b0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
142c0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
142d0 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
142e0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
142f0 7a 53 74 6d 74 4a 72 6e 6c 2c 20 7a 53 74 6d 74  zStmtJrnl, zStmt
14300 4a 72 6e 6c 2c 20 6e 53 74 6d 74 4a 72 6e 6c 2b  Jrnl, nStmtJrnl+
14310 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
14320 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  ee(zPathname);..
14330 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
14340 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
14350 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
14360 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
14370 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
14380 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70  if( nPathname>(p
14390 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
143a0 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e  - sizeof("-journ
143b0 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72  al")) ){.      r
143c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
143d0 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  PEN;.    }else{.
143e0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
143f0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
14400 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
14410 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
14420 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
14430 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14440 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
14450 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  r->vfsFlags, &fo
14460 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f  ut);.      readO
14470 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
14480 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
14490 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
144a0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
144b0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
144c0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
144d0 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a  access,.      **
144e0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
144f0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
14500 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
14510 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  reate the.      
14520 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14530 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
14540 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
14550 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20  aximum of:.     
14560 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
14570 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
14580 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
14590 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
145a0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
145b0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
145c0 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20  ize().      **  
145d0 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
145e0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
145f0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
14600 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20  omically..      
14610 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
14620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
14630 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
14640 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69     int iSectorSi
14650 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
14660 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
14670 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >fd);.        if
14680 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69  ( nDefaultPage<i
14690 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  SectorSize ){.  
146a0 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74          nDefault
146b0 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Page = iSectorSi
146c0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
146d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
146e0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
146f0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
14700 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
14710 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
14720 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
14730 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
14740 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
14750 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
14760 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
14770 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
14780 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
14790 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
147a0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
147b0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
147c0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
147d0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
147e0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
147f0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44         for(ii=nD
14800 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d  efaultPage; ii<=
14810 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14820 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
14830 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
14840 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
14850 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
14860 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66  |(ii>>8)) ) nDef
14870 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20  aultPage = ii;. 
14880 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
148a0 20 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74      if( nDefault
148b0 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Page>SQLITE_MAX_
148c0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
148d0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  E ){.          n
148e0 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51  DefaultPage = SQ
148f0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
14900 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
14910 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14920 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
14930 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a  !memDb ){.    /*
14940 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
14950 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
14960 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
14970 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
14980 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
14990 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
149a0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
149b0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
149c0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
149d0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
149e0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
149f0 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
14a00 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  )..    */ .    t
14a10 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
14a20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
14a30 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14a40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
14a50 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ger && rc==SQLIT
14a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
14a70 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
14a80 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
14a90 6f 28 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b  o(nDefaultPage);
14aa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
14ab0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
14ac0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
14ad0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20  blocks above..  
14ae0 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
14af0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
14b00 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
14b10 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70    ** Since the p
14b20 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
14b30 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
14b40 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
14b50 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
14b60 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
14b70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
14b80 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ger || !pPager->
14b90 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14ba0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
14bb0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
14bc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
14bd0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
14be0 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
14bf0 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
14c00 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
14c10 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
14c20 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
14c30 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
14c40 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
14c50 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
14c60 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
14c70 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
14c80 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
14c90 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
14ca0 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
14cb0 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
14cc0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
14cd0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14ce0 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
14cf0 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50   for(i=strlen(pP
14d00 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14d10 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  ); i>0 && pPager
14d20 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
14d30 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
14d40 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
14d50 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
14d60 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
14d70 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
14d80 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  rnal[] */.  memc
14d90 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
14da0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
14db0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
14dc0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
14dd0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
14de0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
14df0 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20 2f 2a  rnal", 9);..  /*
14e00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14e10 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
14e20 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
14e30 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
14e40 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
14e50 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
14e60 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
14e70 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
14e80 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
14e90 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14ea0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
14eb0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14ec0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
14ed0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14ee0 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
14ef0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
14f00 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 0a 20   nDefaultPage;. 
14f10 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
14f20 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
14f30 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
14f40 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
14f50 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
14f60 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14f70 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
14f80 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
14f90 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
14fa0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
14fb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
14fc0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
14fd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14fe0 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
14ff0 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
15000 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
15010 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50  LOCK) );.  /* pP
15020 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
15030 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
15040 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
15050 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
15060 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
15070 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
15080 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
15090 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
150a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
150b0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
150c0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
150d0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
150e0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
150f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74  xclusiveMode = t
15100 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
15110 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
15120 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
15130 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
15140 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
15150 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
15160 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
15170 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
15180 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
15190 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
151a0 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
151b0 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
151c0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
151d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
151e0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
151f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
15200 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
15210 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
15220 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
15230 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
15240 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
15250 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
15260 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
15270 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
15280 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65  fd->pMethods||me
15290 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a  mDb||tempFile);.
152a0 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
152b0 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
152c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
152d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
152e0 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
152f0 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
15300 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
15310 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
15320 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
15330 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
15340 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15350 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15360 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e  EMENT.  pPager->
15370 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20  iInUseMM = 0;.  
15380 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
15390 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d   = 0;.  if( !mem
153a0 44 62 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  Db ){.#ifndef SQ
153b0 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a  LITE_MUTEX_NOOP.
153c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
153d0 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
153e0 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
153f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15400 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66  IC_MEM2);.#endif
15410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
15420 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
15430 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  .    pPager->pNe
15440 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  xt = sqlite3Page
15450 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  rList;.    if( s
15460 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
15470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15480 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
15490 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20  t->pPrev==0 );. 
154a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
154b0 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  rList->pPrev = p
154c0 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Pager;.    }.   
154d0 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d   pPager->pPrev =
154e0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   0;.    sqlite3P
154f0 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
15500 72 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  r;.    pPager->o
15510 6e 50 61 67 65 72 4c 69 73 74 20 3d 20 31 3b 0a  nPagerList = 1;.
15520 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15530 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a  x_leave(mutex);.
15540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
15550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15560 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15570 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
15580 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
15590 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
155a0 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
155b0 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
155c0 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
155d0 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
155e0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
155f0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
15600 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
15610 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
15620 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
15630 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
15640 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
15650 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
15660 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
15670 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
15680 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
15690 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
156a0 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
156b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
156c0 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
156d0 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
156e0 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
156f0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
15700 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
15710 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50   result sqlite3P
15720 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a  agerClose().  .*
15730 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
15740 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
15750 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
15760 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ef()..*/.void sq
15770 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73  lite3PagerSetDes
15780 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
15790 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
157a0 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  esc)(DbPage*,int
157b0 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44  )){.  pPager->xD
157c0 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73  estructor = xDes
157d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
157e0 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
157f0 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
15800 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
15810 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
15820 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
15830 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
15840 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
15850 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
15860 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
15870 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
15880 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
15890 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
158a0 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
158b0 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
158c0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
158d0 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
158e0 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
158f0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
15900 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
15910 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15920 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
15930 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15940 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
15950 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
15960 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
15970 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
15980 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
15990 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61  age size to *pPa
159a0 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73  geSize. If the s
159b0 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 20  uggest new page 
159c0 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70  size is.** inapp
159d0 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
159e0 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
159f0 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
15a00 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20  o that.** value 
15a10 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
15a20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15a30 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
15a40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15a50 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b  u16 *pPageSize){
15a60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15a70 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67  TE_OK;.  u16 pag
15a80 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
15a90 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ze;.  assert( pa
15aa0 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
15ab0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
15ac0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
15ad0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
15ae0 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
15af0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
15b00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
15b10 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d     && !pPager->m
15b20 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e  emDb && pPager->
15b30 6e 52 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  nRef==0 .  ){.  
15b40 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
15b50 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
15b60 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
15b70 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29  .    if( !pNew )
15b80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15b90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
15ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
15bb0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
15bc0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
15bd0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
15be0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15bf0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
15c00 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
15c10 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
15c20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
15c30 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
15c40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
15c50 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
15c60 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61  ;.      pagerLea
15c70 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
15c80 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53 69  }.  }.  *pPageSi
15c90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
15ca0 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
15cb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
15cc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
15cd0 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
15ce0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
15cf0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
15d00 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
15d10 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
15d20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
15d30 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
15d40 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
15d50 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
15d60 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
15d70 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
15d80 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
15d90 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
15da0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
15db0 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
15dc0 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
15dd0 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
15de0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
15df0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
15e00 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
15e10 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
15e20 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
15e30 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
15e40 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
15e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
15e60 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
15e70 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
15e80 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
15e90 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
15ea0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
15eb0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
15ec0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
15ed0 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
15ee0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
15ef0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
15f00 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
15f10 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
15f20 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
15f30 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
15f40 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
15f50 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
15f60 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
15f70 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
15f80 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
15f90 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
15fa0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
15fb0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
15fc0 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
15fd0 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
15fe0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
15ff0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
16000 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
16010 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
16020 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
16030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
16040 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
16050 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
16060 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
16070 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
16080 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
16090 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
160a0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
160b0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
160c0 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
160d0 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
160e0 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
160f0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
16100 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
16110 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
16120 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
16130 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
16140 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
16150 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16160 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
16170 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
16180 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
16190 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
161a0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
161b0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
161c0 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
161d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
161e0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
161f0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
16200 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
16210 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
16220 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
16230 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
16240 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
16250 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
16260 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
16270 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
16280 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
16290 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
162a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
162b0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
162c0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
162d0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
162e0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
162f0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
16300 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
16310 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
16320 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
16330 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
16340 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
16350 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
16360 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
16370 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
16380 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
16390 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
163a0 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
163b0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
163c0 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
163d0 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
163e0 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
163f0 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
16400 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
16410 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
16420 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
16430 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
16440 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
16450 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
16460 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
16470 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
16480 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
16490 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
164a0 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
164b0 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
164c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
164d0 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
164e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
164f0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
16500 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
16510 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16520 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
16530 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
16540 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d  t(MEMDB||pPager-
16550 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
16560 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
16570 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16580 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
16590 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
165a0 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
165b0 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
165c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
165d0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
165e0 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
165f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16600 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
16610 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
16620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
16630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16650 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
16660 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
16670 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
16680 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
16690 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
166a0 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
166b0 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
166c0 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
166d0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
166e0 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
166f0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
16700 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
16710 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
16720 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
16730 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
16740 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
16750 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
16760 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
16770 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
16780 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
16790 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
167a0 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
167b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
167c0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
167d0 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b  r){.  i64 n = 0;
167e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
167f0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
16800 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16810 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
16820 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
16830 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
16840 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
16850 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
16860 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
16870 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
16880 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
16890 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
168a0 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
168b0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
168c0 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
168d0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
168e0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
168f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16900 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
16910 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ++;.      pager_
16920 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
16930 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
16940 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72  >nRef--;.      r
16950 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
16960 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
16970 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
16980 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31  e ){.      n = 1
16990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
169a0 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e     n /= pPager->
169b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
169c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
169d0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
169e0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
169f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
16a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
16a10 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54   n==(PENDING_BYT
16a20 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
16a30 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ze) ){.    n++;.
16a40 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67    }.  if( n>pPag
16a50 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
16a60 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
16a70 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = n;.  }.  retu
16a80 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  rn n;.}...#ifnde
16a90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
16aa0 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65  MORYDB./*.** Cle
16ab0 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62  ar a PgHistory b
16ac0 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lock.*/.static v
16ad0 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79  oid clearHistory
16ae0 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73  (PgHistory *pHis
16af0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t){.  sqlite3_fr
16b00 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
16b10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
16b20 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
16b30 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
16b40 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
16b50 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  mt = 0;.}.#else.
16b60 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73  #define clearHis
16b70 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a  tory(x).#endif..
16b80 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
16b90 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
16ba0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
16bb0 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a  nal(Pager*);../*
16bc0 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
16bd0 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
16be0 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
16bf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
16c00 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
16c10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
16c20 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
16c30 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
16c40 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
16c50 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
16c60 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
16c70 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
16c80 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e   leave a page in
16c90 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72   the .** pNextFr
16ca0 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73  ee/pPrevFree lis
16cb0 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
16cc0 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
16cd0 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  -chain..*/.stati
16ce0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73  c void unlinkHas
16cf0 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50  hChain(Pager *pP
16d00 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
16d10 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ){.  if( pPg->pg
16d20 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  no==0 ){.    ass
16d30 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
16d40 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
16d50 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
16d60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
16d70 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
16d80 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
16d90 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
16da0 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
16db0 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
16dc0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
16dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16de0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67  Pager->aHash[pPg
16df0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
16e00 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67  ->nHash-1)]!=pPg
16e10 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
16e20 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
16e30 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
16e40 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
16e50 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67   int h = pPg->pg
16e60 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
16e70 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67  ash-1);.    pPag
16e80 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
16e90 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
16ea0 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
16eb0 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f  {.    clearHisto
16ec0 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
16ed0 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
16ee0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20    }.  pPg->pgno 
16ef0 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
16f00 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
16f10 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
16f20 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
16f30 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
16f40 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
16f50 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
16f60 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
16f70 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
16f80 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
16f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16fa0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
16fb0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
16fc0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
16fd0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e  pPager;..  /* Un
16fe0 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20 70  link from free p
16ff0 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c 72  age list */.  lr
17000 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29  uListRemove(pPg)
17010 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
17020 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
17030 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
17040 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
17050 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  ger, pPg);.}../*
17060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17070 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e   is used to trun
17080 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20 77  cate the cache w
17090 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a  hen a database.*
170a0 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20  * is truncated. 
170b0 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63   Drop from the c
170c0 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77  ache all pages w
170d0 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20  hose pgno is.** 
170e0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
170f0 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
17100 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
17110 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64  **.** Referenced
17120 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68   pages larger th
17130 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
17140 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  e are zeroed..**
17150 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74  .** Actually, at
17160 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20   the point this 
17170 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17180 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a  d, it would be.*
17190 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61  * an error to ha
171a0 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64 20  ve a referenced 
171b0 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68 65  page.  But rathe
171c0 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a  r than delete.**
171d0 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20 67   that page and g
171e0 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73 65  uarantee a subse
171f0 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20  quent segfault, 
17200 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a  it seems better.
17210 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e  ** to zero it an
17220 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20 65  d hope that we e
17230 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e  rror out sanely.
17240 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17250 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
17260 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
17270 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
17280 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
17290 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
172a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
172b0 3b 0a 0a 20 20 70 61 67 65 72 4d 75 74 65 78 48  ;..  pagerMutexH
172c0 65 6c 64 28 70 50 61 67 65 72 29 3b 0a 20 20 70  eld(pPager);.  p
172d0 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
172e0 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
172f0 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
17300 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
17310 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
17320 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
17330 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
17340 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
17350 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
17360 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
17370 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
17380 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17390 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
173a0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
173b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
173c0 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
173d0 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  All;.      IOTRA
173e0 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
173f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
17400 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
17410 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
17420 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
17430 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75  _count);.      u
17440 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
17450 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
17460 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
17470 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44  te3_free(pPg->pD
17480 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
17490 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
174a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
174b0 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
174c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
174d0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
174e0 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
174f0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
17500 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
17510 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
17520 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
17530 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
17540 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
17550 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
17560 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
17570 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
17580 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17590 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
175a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
175b0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
175c0 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
175d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
175e0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
175f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17600 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
17610 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
17620 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
17630 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
17640 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
17650 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
17660 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
17670 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
17680 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
17690 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
176a0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
176b0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
176c0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
176d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
176e0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
176f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
17700 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
17710 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
17720 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
17730 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17740 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
17750 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
17760 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
17770 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17780 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
17790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
177a0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
177b0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 75 73  if( pPager->pBus
177c0 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61 67 65  yHandler ) pPage
177d0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
177e0 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >nBusy = 0;.    
177f0 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
17800 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
17810 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
17820 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
17830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
17840 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
17850 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
17860 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
17870 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
17880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
178a0 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
178b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
178c0 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
178d0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
178e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
178f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17900 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
17910 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
17920 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
17930 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
17940 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
17950 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17960 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
17970 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
17980 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17990 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
179a0 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
179b0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
179c0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
179d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
179e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
179f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
17a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17a10 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
17a20 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
17a30 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
17a40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17a50 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
17a60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
17a70 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
17a80 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
17a90 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  ger);.    pager_
17aa0 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
17ab0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65  Pager);.    page
17ac0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
17ad0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17ae0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65  E_OK;.  }.  page
17af0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
17b00 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
17b10 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  al(pPager);.  pa
17b20 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
17b30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17b50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
17b60 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
17b70 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
17b80 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
17b90 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
17ba0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
17bb0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
17bc0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
17bd0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
17be0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 3d  LOCK);.  if( rc=
17bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17c00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
17c10 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
17c20 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  age);.  }.  page
17c30 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
17c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17c50 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
17c60 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
17c70 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
17c80 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
17c90 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
17ca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17cb0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
17cc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17cd0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
17ce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17cf0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
17d00 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
17d10 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
17d20 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
17d30 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
17d40 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
17d50 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
17d60 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
17d70 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
17d80 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
17d90 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
17da0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
17db0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
17dc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17dd0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
17de0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
17df0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
17e00 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
17e10 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
17e20 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
17e30 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
17e40 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
17e50 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
17e60 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
17e70 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
17e80 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
17e90 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
17ea0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
17eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
17ec0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
17ed0 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
17ee0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
17ef0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
17f00 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
17f10 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
17f20 61 76 65 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ave(pPager);.#if
17f30 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17f40 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
17f50 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  ENT.  if( !MEMDB
17f60 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
17f70 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20  TE_MUTEX_NOOP.  
17f80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
17f90 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  *mutex = sqlite3
17fa0 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
17fb0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
17fc0 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  _MEM2);.#endif. 
17fd0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
17fe0 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
17ff0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
18000 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50  Prev ){.      pP
18010 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  ager->pPrev->pNe
18020 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
18030 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
18040 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18050 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e  rList = pPager->
18060 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
18070 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65   if( pPager->pNe
18080 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  xt ){.      pPag
18090 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  er->pNext->pPrev
180a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76   = pPager->pPrev
180b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
180c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
180d0 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61 67  mutex);.    pPag
180e0 65 72 2d 3e 6f 6e 50 61 67 65 72 4c 69 73 74 20  er->onPagerList 
180f0 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
18100 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
18110 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
18120 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42  .  sqlite3FaultB
18130 65 67 69 6e 42 65 6e 69 67 6e 28 2d 31 29 3b 0a  eginBenign(-1);.
18140 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
18150 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
18160 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
18170 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
18180 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
18190 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
181a0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 45 6e 64   sqlite3FaultEnd
181b0 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 50 41  Benign(-1);.  PA
181c0 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
181d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
181e0 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
181f0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
18200 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69 66  ", pPager)).  if
18210 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18220 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
18230 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
18240 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
18250 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
18260 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
18270 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
18280 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
18290 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
182a0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
182b0 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
182c0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
182d0 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
182e0 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
182f0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
18300 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
18310 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
18320 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
18330 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18340 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
18350 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
18360 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18370 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
18380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
18390 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
183a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
183b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
183c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
183d0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
183e0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
183f0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
18400 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18410 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
18420 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
18430 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
18440 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
18450 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
18460 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
18470 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18480 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
18490 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
184a0 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
184b0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
184c0 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
184d0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
184e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
184f0 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
18500 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
18510 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
18520 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
18530 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
18540 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
18550 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
18560 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
18570 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
18580 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
18590 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
185a0 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
185b0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
185c0 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
185d0 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
185e0 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
185f0 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
18600 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
18610 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
18620 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
18630 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
18640 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
18650 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
18660 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
18670 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
18680 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
18690 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
186a0 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
186b0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
186c0 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
186d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
186e0 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
186f0 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
18700 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
18710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
18720 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
18730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
18740 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
18750 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
18760 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
18770 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
18780 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
18790 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
187a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
187b0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
187c0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
187d0 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
187e0 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
187f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18800 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
18810 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
18820 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
18830 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
18840 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
18850 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
18860 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
18870 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
18880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18890 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
188a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
188b0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
188c0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
188d0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
188e0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
188f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
18900 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
18910 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
18920 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
18930 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
18940 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
18950 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
18960 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
18970 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
18980 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
18990 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
189a0 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
189b0 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
189c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
189d0 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
189e0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
189f0 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
18a00 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
18a10 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
18a20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
18a30 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
18a40 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
18a50 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
18a60 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
18a70 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
18a80 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
18a90 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
18aa0 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
18ab0 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
18ac0 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
18ad0 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
18ae0 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
18af0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
18b00 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
18b10 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
18b20 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
18b30 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
18b40 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
18b50 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
18b60 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
18b70 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
18b80 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18b90 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
18ba0 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
18bb0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
18bc0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
18bd0 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
18be0 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
18bf0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
18c00 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
18c10 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
18c20 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
18c30 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
18c40 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
18c50 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
18c60 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
18c70 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
18c80 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
18c90 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
18ca0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
18cb0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
18cc0 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
18cd0 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
18ce0 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
18cf0 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
18d00 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
18d10 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
18d20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18d30 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
18d40 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
18d50 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
18d60 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
18d70 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
18d80 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
18d90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18da0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
18db0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18dc0 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
18dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
18de0 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
18df0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
18e00 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
18e10 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
18e20 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
18e30 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
18e40 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18e50 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
18e60 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
18e70 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
18e80 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
18e90 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
18ea0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
18eb0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
18ec0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
18ed0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
18ee0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
18ef0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
18f00 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
18f10 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18f20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
18f30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18f40 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
18f50 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
18f60 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
18f70 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
18f80 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
18f90 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
18fa0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
18fb0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
18fc0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
18fd0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
18fe0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
18ff0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
19000 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
19010 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
19020 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
19030 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
19040 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
19050 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
19060 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
19070 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
19080 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
19090 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
190a0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
190b0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
190c0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
190d0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
190e0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
190f0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
19100 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
19110 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
19120 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
19130 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
19140 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
19150 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
19160 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
19170 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
19180 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
19190 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
191a0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
191b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
191c0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
191d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
191e0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
191f0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
19200 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
19210 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
19220 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
19230 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
19240 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
19250 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
19260 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
19270 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
19280 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
19290 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
192a0 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
192b0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
192c0 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
192d0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
192e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
192f0 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
19300 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
19310 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
19320 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
19330 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
19340 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
19350 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
19360 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19370 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19380 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
19390 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
193a0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
193b0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
193c0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
193d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
193e0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
193f0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
19400 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
19410 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19420 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
19430 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
19440 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
19450 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
19460 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
19470 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
19480 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
19490 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
194a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
194b0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
194c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
194d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
194e0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
194f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
19500 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
19510 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
19520 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
19530 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
19540 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
19550 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
19560 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
19570 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
19580 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
19590 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65   }.    lruListSe
195a0 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
195b0 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  ger);.  }..#ifnd
195c0 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
195d0 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
195e0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
195f0 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
19600 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
19610 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
19620 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
19630 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
19640 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
19650 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
19660 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
19670 20 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c 64    pagerMutexHeld
19680 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 66 6f  (pPager);.    fo
19690 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
196a0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
196b0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
196c0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
196d0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
196e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
196f0 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
19700 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
19710 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b  r->lru.pFirst );
19720 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
19730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19740 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
19750 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
19760 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
19770 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
19780 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
19790 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
197a0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
197b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
197c0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
197d0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
197e0 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
197f0 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
19800 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
19810 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
19820 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
19830 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
19840 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
19850 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
19860 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
19870 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
19880 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
19890 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
198a0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
198b0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
198c0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
198d0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
198e0 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
198f0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
19900 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
19910 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
19920 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
19930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
19940 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
19950 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
19960 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
19970 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
19980 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
19990 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
199a0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
199b0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
199c0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
199d0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
199e0 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
199f0 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
19a00 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
19a10 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
19a20 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65  KET_ALLOC 25.#de
19a30 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
19a40 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64  ET       25.#ifd
19a50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
19a60 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
19a70 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
19a80 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e   = 0;.  #undef N
19a90 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23  _SORT_BUCKET.  #
19aa0 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
19ab0 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74  CKET \.   (sqlit
19ac0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19ad0 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70  bucket?sqlite3_p
19ae0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
19af0 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  et:N_SORT_BUCKET
19b00 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73  _ALLOC).#endif.s
19b10 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72  tatic PgHdr *sor
19b20 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  t_pagelist(PgHdr
19b30 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20   *pIn){.  PgHdr 
19b40 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  *a[N_SORT_BUCKET
19b50 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69  _ALLOC], *p;.  i
19b60 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61  nt i;.  memset(a
19b70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
19b80 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b  .  while( pIn ){
19b90 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20  .    p = pIn;.  
19ba0 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74    pIn = p->pDirt
19bb0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
19bc0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
19bd0 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  0; i<N_SORT_BUCK
19be0 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ET-1; i++){.    
19bf0 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b    if( a[i]==0 ){
19c00 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
19c10 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
19c20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19c30 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65         p = merge
19c40 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
19c50 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d  p);.        a[i]
19c60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19c70 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e    }.    if( i==N
19c80 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29  _SORT_BUCKET-1 )
19c90 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72  {.      /* Cover
19ca0 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65  age: To get here
19cb0 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20  , there need to 
19cc0 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43  be 2^(N_SORT_BUC
19cd0 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65  KET) .      ** e
19ce0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
19cf0 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20  nput list. This 
19d00 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74  is possible, but
19d10 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20   impractical..  
19d20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74      ** Testing t
19d30 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20  his line is the 
19d40 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20  point of global 
19d50 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
19d60 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  * sqlite3_pager_
19d70 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20  n_sort_bucket.. 
19d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b       */.      a[
19d90 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
19da0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
19db0 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
19dc0 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
19dd0 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
19de0 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
19df0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
19e00 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
19e10 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
19e20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
19e30 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
19e40 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
19e50 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
19e60 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
19e70 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
19e80 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
19e90 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
19ea0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
19eb0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
19ec0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
19ed0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
19ee0 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
19ef0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48  r *pPager;.  PgH
19f00 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b  dr *p;.  int rc;
19f10 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
19f20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19f30 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
19f40 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
19f50 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
19f60 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
19f70 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
19f80 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
19f90 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
19fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
19fb0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
19fc0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
19fd0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
19fe0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
19ff0 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
1a000 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
1a010 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
1a020 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
1a030 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
1a040 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
1a050 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
1a060 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
1a070 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
1a080 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
1a090 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
1a0a0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
1a0b0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
1a0c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a0d0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
1a0e0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
1a0f0 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
1a100 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
1a110 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
1a120 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
1a130 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
1a140 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
1a150 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
1a160 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
1a170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
1a180 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
1a190 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
1a1a0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
1a1b0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1a1c0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
1a1d0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
1a1e0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
1a1f0 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
1a200 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1a210 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1a220 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1a230 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1a240 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1a250 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1a260 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1a270 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1a280 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1a290 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1a2a0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1a2b0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1a2c0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1a2d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1a2e0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1a2f0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
1a300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1a320 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
1a330 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
1a340 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1a350 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1a360 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1a370 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e  dirty );.    p->
1a380 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
1a390 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
1a3a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1a3b0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1a3c0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1a3d0 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
1a3e0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
1a3f0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1a400 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1a410 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
1a420 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a430 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
1a440 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
1a450 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1a460 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  >zFilename,.    
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1a490 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
1a4a0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1a4b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1a4c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1a4d0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
1a4e0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1a4f0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
1a500 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
1a510 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
1a520 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
1a530 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1a540 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
1a550 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1a560 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1a570 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1a580 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1a590 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1a5a0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1a5b0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1a5c0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1a5d0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
1a5e0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
1a5f0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1a600 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
1a610 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1a620 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1a630 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
1a640 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1a650 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
1a660 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
1a670 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
1a680 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20  ERTRACE4("STORE 
1a690 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1a6a0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1a6c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
1a6d0 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
1a6e0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1a6f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1a700 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
1a710 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74  ", pPager, pList
1a720 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
1a730 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1a740 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1a750 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1a760 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1a770 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1a780 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1a790 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1a7a0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1a7b0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1a7c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
1a7d0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
1a7e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1a7f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1a800 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
1a810 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1a820 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1a830 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
1a840 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
1a850 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1a860 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
1a870 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1a880 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
1a890 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1a8a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
1a8b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1a8c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1a8d0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1a8e0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
1a8f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1a900 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
1a910 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
1a920 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
1a930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
1a950 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
1a960 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
1a970 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
1a980 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1a990 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
1a9a0 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
1a9b0 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
1a9c0 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
1a9d0 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
1a9e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
1a9f0 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
1aa00 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
1aa10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 23  ger *pPager){..#
1aa20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1aa30 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 73 61  /* Verify the sa
1aa40 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69 72 74  nity of the dirt
1aa50 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20 61  y list when we a
1aa60 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20  re running.  ** 
1aa70 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f 64  in debugging mod
1aa80 65 2e 20 20 54 68 69 73 20 69 73 20 65 78 70 65  e.  This is expe
1aa90 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f 74  nsive, so do not
1aaa0 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f 6e  .  ** do this on
1aab0 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1aac0 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20 30   */.  int n1 = 0
1aad0 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b 0a  ;.  int n2 = 0;.
1aae0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66 6f    PgHdr *p;.  fo
1aaf0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
1ab00 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
1ab10 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72 74  ll){ if( p->dirt
1ab20 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f  y ) n1++; }.  fo
1ab30 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69 72  r(p=pPager->pDir
1ab40 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  ty; p; p=p->pDir
1ab50 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61  ty){ n2++; }.  a
1ab60 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29 3b  ssert( n1==n2 );
1ab70 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1ab80 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  n pPager->pDirty
1ab90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1aba0 6e 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  n 1 if there is 
1abb0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
1abc0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
1abd0 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
1abe0 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
1abf0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1ac00 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
1ac10 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1ac20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ac30 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
1ac40 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
1ac50 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
1ac60 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
1ac70 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
1ac80 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
1ac90 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
1aca0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
1acb0 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
1acc0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1acd0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1ace0 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   if unable to de
1acf0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 74  termine the stat
1ad00 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  us of the journa
1ad10 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  l..**.** This ro
1ad20 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f  utine does not o
1ad30 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1ad40 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
1ad50 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  its.** content. 
1ad60 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72   Hence, the jour
1ad70 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1ad80 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1ad90 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1ada0 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  l file that has 
1adb0 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e  been deleted, an
1adc0 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20 68  d hence not be h
1add0 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68  ot.  Or.** the h
1ade0 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
1adf0 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a 65  rnal might be ze
1ae00 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20  roed out.  This 
1ae10 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
1ae20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68 65  not discover the
1ae30 73 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e 6f  se cases of a no
1ae40 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20  n-hot journal - 
1ae50 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  if the.** journa
1ae60 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1ae70 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 74  d is not empty t
1ae80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75  his routine assu
1ae90 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74  mes it.** is hot
1aea0 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  .  The pager_pla
1aeb0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1aec0 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
1aed0 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  at the.** journa
1aee0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
1aef0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69 6c  ally hot and wil
1af00 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  l no-op..*/.stat
1af10 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
1af20 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1af30 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
1af40 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1af50 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
1af60 63 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  c;.  if( !pPager
1af70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
1af80 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
1af90 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1afa0 68 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30 3b  hods ) return 0;
1afb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1afc0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
1afd0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1afe0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1aff0 49 53 54 53 29 3b 0a 20 20 69 66 28 20 72 63 3c  ISTS);.  if( rc<
1b000 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b010 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73   rc;.  }.  if( s
1b020 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
1b030 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
1b040 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74  ->fd) ){.    ret
1b050 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1b060 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1b070 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d  ecount(pPager)==
1b080 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1b090 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
1b0a0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1b0b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1b0c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1b0d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
1b0e0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
1b0f0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
1b100 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e 20   cache that can 
1b110 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a  be recycled. .**
1b120 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b130 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1b140 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
1b150 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f  _FULL or SQLITE_
1b160 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20  OK. It .** does 
1b170 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61 67  not set the pPag
1b180 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69  er->errCode vari
1b190 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
1b1a0 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c  int pager_recycl
1b1b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1b1c0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
1b1d0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1b1e0 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  *ppPg = 0;..  /*
1b1f0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1b200 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
1b210 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  tion unless the 
1b220 70 61 67 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a  pager object.  *
1b230 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
1b240 70 50 61 67 65 72 20 68 61 73 20 61 74 20 6c 65  pPager has at le
1b250 61 73 74 20 6f 6e 65 20 66 72 65 65 20 70 61 67  ast one free pag
1b260 65 20 28 70 61 67 65 20 77 69 74 68 20 6e 52 65  e (page with nRe
1b270 66 3d 3d 30 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  f==0)..  */.  as
1b280 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20  sert(!MEMDB);.  
1b290 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
1b2a0 72 75 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f  ru.pFirst);..  /
1b2b0 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
1b2c0 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
1b2d0 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
1b2e0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
1b2f0 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
1b300 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
1b310 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
1b320 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67   */.  pPg = pPag
1b330 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1b340 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nced;..  /* If w
1b350 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
1b360 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
1b370 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
1b380 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e   fsync().  ** on
1b390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b3a0 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
1b3b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b3c0 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76  This is a.  ** v
1b3d0 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
1b3e0 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
1b3f0 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
1b400 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
1b410 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
1b420 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20   helped..  */.  
1b430 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50  if( pPg==0 && pP
1b440 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1b450 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  ){.    int iDc =
1b460 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1b470 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1b480 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1b490 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
1b4a0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1b4b0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1b4c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b4d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b4e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1b4f0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1b500 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1b510 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  END) ){.      /*
1b520 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
1b530 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
1b540 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
1b550 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
1b560 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1b570 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
1b580 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
1b590 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
1b5a0 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
1b5b0 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
1b5c0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1b5d0 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
1b5e0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
1b5f0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1b600 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
1b610 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
1b620 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
1b630 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
1b640 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
1b650 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
1b660 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
1b670 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
1b680 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b690 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
1b6a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1b6b0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1b6c0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
1b6d0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1b6e0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1b6f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
1b700 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1b710 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b720 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
1b730 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b  ger->lru.pFirst;
1b740 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1b750 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
1b760 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1b770 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
1b780 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
1b790 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
1b7a0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1b7b0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1b7c0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1b7d0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
1b7e0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1b7f0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
1b800 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
1b810 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
1b820 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1b830 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
1b840 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1b850 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
1b860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b870 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b880 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1b890 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
1b8a0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1b8b0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
1b8c0 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
1b8d0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1b8e0 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
1b8f0 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
1b900 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1b910 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
1b920 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
1b930 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1b940 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
1b950 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
1b960 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1b970 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
1b980 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
1b990 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
1b9a0 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
1b9b0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
1b9c0 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
1b9d0 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
1b9e0 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
1b9f0 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
1ba00 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
1ba10 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
1ba20 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
1ba30 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1ba40 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
1ba50 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
1ba60 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1ba70 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
1ba80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1ba90 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1baa0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
1bab0 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
1bac0 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
1bad0 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
1bae0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
1baf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
1bb00 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
1bb10 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
1bb20 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
1bb30 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
1bb40 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
1bb50 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1bb60 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67  o==0 );..  *ppPg
1bb70 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
1bb80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1bb90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1bba0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1bbb0 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EMENT./*.** This
1bbc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1bbd0 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65  led to free supe
1bbe0 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61  rfluous dynamica
1bbf0 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  lly allocated me
1bc00 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20  mory.** held by 
1bc10 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d  the pager system
1bc20 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  . Memory in use 
1bc30 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61  by any SQLite pa
1bc40 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ger allocated.**
1bc50 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1bc60 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71  thread may be sq
1bc70 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a  lite3_free()ed..
1bc80 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
1bc90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bca0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
1bcb0 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
1bcc0 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
1bcd0 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
1bce0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
1bcf0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1bd00 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
1bd10 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
1bd20 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1bd30 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eased..*/.int sq
1bd40 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
1bd50 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
1bd60 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  ){.  int nReleas
1bd70 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1bd80 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
1bd90 6f 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20  ory released so 
1bda0 66 61 72 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  far */.  Pager *
1bdb0 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
1bdc0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1bdd0 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73 20  ing over pagers 
1bde0 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
1bdf0 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20 20   *savedBusy;    
1be00 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20 6f   /* Saved copy o
1be10 66 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  f the busy handl
1be20 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1be30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1be40 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 65  * Acquire the me
1be50 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1be60 6d 75 74 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64  mutex.  */.#ifnd
1be70 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
1be80 4e 4f 4f 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NOOP.  sqlite3_m
1be90 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1bea0 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d     /* The MEM2 m
1beb0 75 74 65 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20  utex */.  mutex 
1bec0 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1bed0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1bee0 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
1bef0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1bf00 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
1bf10 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e  tex);..  /* Sign
1bf20 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  al all database 
1bf30 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1bf40 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   memory manageme
1bf50 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f  nt wants.  ** to
1bf60 20 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20   have access to 
1bf70 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f  the pagers..  */
1bf80 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1bf90 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1bfa0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1bfb0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1bfc0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1bfd0 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  seMM = 1;.  }.. 
1bfe0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1bff0 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30  TE_OK && (nReq<0
1c000 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
1c010 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72  eq) ){.    PgHdr
1c020 20 2a 70 50 67 3b 0a 20 0a 20 20 20 20 2f 2a 20   *pPg;. .    /* 
1c030 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61  Try to find a pa
1c040 67 65 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68  ge to recycle th
1c050 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
1c060 69 72 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66  ire a sync(). If
1c070 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
1c080 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69  not possible, fi
1c090 6e 64 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73  nd one that does
1c0a0 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28   require a sync(
1c0b0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
1c0c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c0d0 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
1c0e0 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1c0f0 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
1c100 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
1c110 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
1c120 69 72 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20  irstSynced;.    
1c130 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 28 70  while( pPg && (p
1c140 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20  Pg->needSync || 
1c150 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e  pPg->pPager->iIn
1c160 55 73 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20  UseDB) ){.      
1c170 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65  pPg = pPg->gfree
1c180 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  .pNext;.    }.  
1c190 20 20 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20    if( !pPg ){.  
1c1a0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1c1b0 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
1c1c0 72 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  rst;.      while
1c1d0 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50  ( pPg && pPg->pP
1c1e0 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29  ager->iInUseDB )
1c1f0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  {.        pPg = 
1c200 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74  pPg->gfree.pNext
1c210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c220 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1c230 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
1c240 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1c250 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1c260 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  LRU));..    /* I
1c270 66 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74  f pPg==0, then t
1c280 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68  he block above h
1c290 61 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e  as failed to fin
1c2a0 64 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20  d a page to.    
1c2b0 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74  ** recycle. In t
1c2c0 68 69 73 20 63 61 73 65 20 72 65 74 75 72 6e 20  his case return 
1c2d0 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68  early - no furth
1c2e0 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20  er memory will. 
1c2f0 20 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65     ** be release
1c300 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1c310 28 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a  ( !pPg ) break;.
1c320 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
1c330 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61  g->pPager;.    a
1c340 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 69  ssert( pPager->i
1c350 49 6e 55 73 65 44 42 3d 3d 30 20 29 3b 0a 20 20  InUseDB==0 );.  
1c360 20 20 73 61 76 65 64 42 75 73 79 20 3d 20 70 50    savedBusy = pP
1c370 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1c380 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  er;.    pPager->
1c390 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
1c3a0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1c3b0 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
1c3c0 20 26 70 50 67 29 3b 0a 20 20 20 20 61 73 73 65   &pPg);.    asse
1c3d0 72 74 28 20 70 50 61 67 65 72 2d 3e 69 49 6e 55  rt( pPager->iInU
1c3e0 73 65 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 70  seDB==0 );.    p
1c3f0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1c400 6c 65 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b  ler = savedBusy;
1c410 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c430 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61  /* We've found a
1c440 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41   page to free. A
1c450 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1c460 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a   page has been .
1c470 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64        ** removed
1c480 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68   from the page h
1c490 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d  ash-table, free-
1c4a0 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d  list and synced-
1c4b0 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 28  list .      ** (
1c4c0 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49  pFirstSynced). I
1c4d0 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68  t is still in th
1c4e0 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c  e all pages (pAl
1c4f0 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  l) list. .      
1c500 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** Remove it fro
1c510 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f  m this list befo
1c520 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20  re freeing..    
1c530 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 6f    **.      ** To
1c540 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61  do: Check the Pa
1c550 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74  ger.pStmt list t
1c560 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73  o make sure this
1c570 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20   is Ok. It .    
1c580 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73    ** probably is
1c590 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a   though..      *
1c5a0 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  /.      PgHdr *p
1c5b0 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tmp;.      asser
1c5c0 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
1c5d0 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
1c5e0 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  >pAll ){.       
1c5f0 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
1c600 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
1c610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c620 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
1c630 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d  Pager->pAll; pTm
1c640 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67  p->pNextAll!=pPg
1c650 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
1c660 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20  xtAll ){}.      
1c670 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c    pTmp->pNextAll
1c680 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
1c690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c6a0 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20  nReleased += (. 
1c6b0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1c6c0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
1c6d0 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
1c6e0 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
1c6f0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
1c700 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45  a.          + ME
1c710 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
1c720 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b 0a  tory) .      );.
1c730 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c740 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c 6e  PGFREE %p %d *\n
1c750 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1c760 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
1c770 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1c780 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
1c790 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  unt);.      sqli
1c7a0 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44  te3_free(pPg->pD
1c7b0 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ata);.      sqli
1c7c0 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
1c7d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
1c7e0 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge--;.    }else{
1c7f0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72  .      /* An err
1c800 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
1c810 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
1c820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1c830 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  r .      ** jour
1c840 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63  nal in pager_rec
1c850 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f  ycle(). The erro
1c860 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65  r is not returne
1c870 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  d to the .      
1c880 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
1c890 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
1c8a0 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
1c8b0 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
1c8c0 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ble..      ** Th
1c8d0 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
1c8e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1c8f0 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20  user (or users, 
1c900 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
1c910 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
1c920 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
1c930 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
1c940 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
1c950 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 2a  occured..      *
1c960 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 0a  /.      assert(.
1c970 20 20 20 20 20 20 20 20 20 20 28 72 63 26 30 78            (rc&0x
1c980 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
1c990 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72  R ||.          r
1c9a0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  c==SQLITE_FULL |
1c9b0 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  |.          rc==
1c9c0 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20  SQLITE_BUSY.    
1c9d0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
1c9e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1c9f0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1ca00 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
1ca10 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1ca20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1ca30 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65 6d  /* Clear the mem
1ca40 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66  ory management f
1ca50 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73 65  lags and release
1ca60 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a   the mutex.  */.
1ca70 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c    for(pPager=sql
1ca80 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70  ite3PagerList; p
1ca90 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50  Pager; pPager=pP
1caa0 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ager->pNext){.  
1cab0 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73     pPager->iInUs
1cac0 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  eMM = 0;.  }.  s
1cad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1cae0 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ve(mutex);..  /*
1caf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1cb00 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c 65  er of bytes rele
1cb10 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ased.  */.  retu
1cb20 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a  rn nReleased;.}.
1cb30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1cb40 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1cb50 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a  ANAGEMENT */../*
1cb60 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
1cb70 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67  tent of page pPg
1cb80 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1cb90 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1cba0 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
1cbb0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
1cbc0 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50  r, PgHdr *pPg, P
1cbd0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
1cbe0 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65   rc;.  i64 offse
1cbf0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  t;.  assert( MEM
1cc00 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  DB==0 );.  asser
1cc10 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
1cc20 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
1cc30 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
1cc40 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
1cc50 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65  ethods ){.    re
1cc60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1cc70 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1cc80 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67  }.  offset = (pg
1cc90 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1cca0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
1ccb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1ccc0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  d(pPager->fd, PG
1ccd0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1cce0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1ccf0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50  ze, offset);.  P
1cd00 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1cd10 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
1cd20 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
1cd30 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
1cd40 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
1cd50 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
1cd60 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1cd70 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1cd80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1cd90 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1cda0 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f  &((u8*)PGHDR_TO_
1cdb0 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a  DATA(pPg))[24],.
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1cdf0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1ce00 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20  ileVers));.  }. 
1ce10 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1ce20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1ce30 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
1ce40 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
1ce50 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1ce60 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1ce70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ce80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ce90 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67  , pPg->pgno, pag
1cea0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1ceb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cec0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1ced0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cee0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
1cef0 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
1cf00 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
1cf10 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
1cf20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
1cf30 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
1cf40 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
1cf50 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
1cf60 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
1cf70 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1cf80 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
1cf90 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
1cfa0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
1cfb0 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
1cfc0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1cfd0 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
1cfe0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
1cff0 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
1d000 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
1d010 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
1d020 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
1d030 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
1d040 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
1d050 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
1d060 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1d070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1d080 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  isHot = 0;..  /*
1d090 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
1d0a0 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20  e is opened for 
1d0b0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
1d0c0 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  , has no outstan
1d0d0 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20  ding .  ** page 
1d0e0 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69  references and i
1d0f0 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
1d100 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20  ate, now is the 
1d110 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a  chance to clear.
1d120 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20    ** the error. 
1d130 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
1d140 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
1d150 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61  r-cache and trea
1d160 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20  t any.  ** open 
1d170 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20  journal file as 
1d180 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  a hot-journal.. 
1d190 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42   */.  if( !MEMDB
1d1a0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   && pPager->excl
1d1b0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
1d1c0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
1d1d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d1e0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1d1f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1d200 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20 3d 20  {.      isHot = 
1d210 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
1d220 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
1d230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61  QLITE_OK;.    pa
1d240 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d250 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1d260 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
1d270 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  ll in an error s
1d280 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f  tate, do not pro
1d290 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20  ceed. The error 
1d2a0 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c  .  ** state will
1d2b0 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73   be cleared at s
1d2c0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1d2d0 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c   future when all
1d2e0 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65   page .  ** refe
1d2f0 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70  rences are dropp
1d300 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
1d310 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
1d320 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1d330 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
1d340 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d350 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
1d360 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1d370 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1d380 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1d390 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1d3a0 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a  OCK || isHot ){.
1d3b0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
1d3c0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1d3d0 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21 4d  pVfs;.    if( !M
1d3e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73  EMDB ){.      as
1d3f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1d400 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ef==0 );.      i
1d410 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65  f( !pPager->noRe
1d420 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
1d430 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1d440 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1d450 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
1d460 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d480 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d490 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1d4a0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1d4b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1d4c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1d4d0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1d4e0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1d4f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d500 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1d510 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
1d520 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
1d530 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
1d540 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
1d550 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1d560 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
1d570 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
1d580 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
1d590 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
1d5a0 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
1d5b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
1d5c0 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
1d5d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1d5e0 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 20  f( rc<0 ){.     
1d5f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1d600 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1d610 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1d620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d630 66 28 20 72 63 3d 3d 31 20 7c 7c 20 69 73 48 6f  f( rc==1 || isHo
1d640 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
1d650 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
1d660 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1d670 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
1d680 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
1d690 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
1d6a0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
1d6b0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
1d6c0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
1d6d0 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
1d6e0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1d6f0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
1d700 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
1d710 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
1d720 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1d730 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
1d740 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
1d750 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
1d760 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
1d770 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1d780 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
1d790 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
1d7a0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
1d7b0 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
1d7c0 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
1d7d0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
1d7e0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
1d7f0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
1d800 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
1d810 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
1d820 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
1d830 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
1d840 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
1d850 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
1d860 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
1d870 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
1d880 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1d890 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d8a0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
1d8b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1d8c0 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
1d8d0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
1d8e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d8f0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1d900 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
1d910 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
1d920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d930 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d940 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
1d950 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1d960 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1d970 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
1d980 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50    }.          pP
1d990 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1d9a0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1d9b0 20 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20         }. .     
1d9c0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
1d9d0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
1d9e0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
1d9f0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
1da00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63   .        ** exc
1da10 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1da20 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
1da30 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
1da40 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
1da50 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79       ** possibly
1da60 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
1da70 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
1da80 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  . On some system
1da90 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  s, the.        *
1daa0 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
1dab0 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
1dac0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
1dad0 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
1dae0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61          ** a rea
1daf0 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
1db00 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  dle..        */.
1db10 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 48          if( !isH
1db20 6f 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  ot && pPager->jo
1db30 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a  urnalOpen==0 ){.
1db40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
1db50 73 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  s = sqlite3OsAcc
1db60 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
1db70 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
1db80 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b  _ACCESS_EXISTS);
1db90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1dba0 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  es==1 ){.       
1dbb0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
1dbc0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1dbd0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
1dbe0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1dbf0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1dc00 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
1dc10 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1dc20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1dc40 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1dc50 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1dc60 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
1dc70 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
1dc80 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1dc90 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
1dca0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   || pPager->jfd-
1dcb0 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20  >pMethods );.   
1dcc0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 75           if( fou
1dcd0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
1dce0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
1dcf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dd00 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1dd10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1dd20 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
1dd30 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
1dd40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
1dd50 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b  se if( res==0 ){
1dd60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1dd70 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
1dd80 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
1dd90 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f  hat means some o
1dda0 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
1ddb0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
1ddc0 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69  already rolled i
1ddd0 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20  t back */.      
1dde0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ddf0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1de00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1de10 20 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74       /* If sqlit
1de20 65 33 4f 73 41 63 63 65 73 73 28 29 20 72 65 74  e3OsAccess() ret
1de30 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 20  urns a negative 
1de40 76 61 6c 75 65 2c 20 74 68 61 74 20 6d 65 61 6e  value, that mean
1de50 73 20 69 74 0a 20 20 20 20 20 20 20 20 20 20 20  s it.           
1de60 20 2a 2a 20 66 61 69 6c 65 64 20 61 20 6d 65 6d   ** failed a mem
1de70 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  ory allocation *
1de80 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
1de90 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1dea0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1deb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1dec0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ded0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1def0 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d  TE_NOMEM && rc!=
1df00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
1df10 4f 43 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20  OCK .           
1df20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1df30 45 52 52 5f 4e 4f 4d 45 4d 20 0a 20 20 20 20 20  ERR_NOMEM .     
1df40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1df50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1df60 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1df70 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
1df80 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
1df90 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1dfa0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1dfb0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   1;.        pPag
1dfc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1dfd0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
1dfe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1dff0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
1e000 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1e010 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
1e020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1e030 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20  r = 0;. .       
1e040 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
1e050 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1e060 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
1e070 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
1e080 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
1e090 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
1e0a0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
1e0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
1e0c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1e0d0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
1e0e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e0f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e100 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1e110 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1e120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
1e130 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1e140 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1e150 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  rt(pPager->state
1e160 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  ==PAGER_SHARED |
1e170 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
1e180 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1e190 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
1e1a0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
1e1b0 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  RED).        );.
1e1c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
1e1d0 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
1e1e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e1f0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
1e200 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
1e210 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
1e220 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
1e230 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
1e240 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
1e250 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
1e260 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
1e270 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f         ** read o
1e280 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1e290 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
1e2a0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
1e2b0 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  ase.        ** h
1e2c0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1e2d0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1e2e0 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
1e2f0 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
1e300 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
1e310 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1e320 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
1e330 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
1e340 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
1e350 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
1e360 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66          ** at of
1e370 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65  fset 24 into the
1e380 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73   file.  The firs
1e390 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20  t 4 of these 16 
1e3a0 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20  bytes are.      
1e3b0 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
1e3c0 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
1e3d0 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
1e3e0 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
1e3f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  .        ** othe
1e400 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
1e410 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
1e420 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
1e430 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  en.        ** a 
1e440 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
1e450 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  .        ** .   
1e460 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
1e470 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
1e480 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
1e490 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
1e4a0 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a  ot be .        *
1e4b0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
1e4c0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
1e4d0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
1e4e0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
1e4f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63  .        ** it c
1e500 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
1e510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e520 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
1e530 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
1e540 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
1e550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e560 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1e570 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
1e580 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1e590 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
1e5a0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1e5b0 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
1e5c0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1e5d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1e5e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1e5f0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1e600 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1e610 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1e620 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1e630 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1e640 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e650 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1e660 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1e670 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1e680 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1e690 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e6a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e6b0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1e6c0 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ed;.          }.
1e6d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e6e0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1e6f0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
1e700 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1e710 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
1e720 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d         if( memcm
1e730 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
1e740 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1e750 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1e760 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
1e770 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1e780 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1e790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e7a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1e7b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1e7c0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
1e7d0 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41  state<=PAGER_SHA
1e7e0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1e7f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1e800 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1e810 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1e820 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1e830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61  ;.    }.  }.. fa
1e840 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
1e850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e860 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
1e870 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
1e880 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
1e890 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
1e8a0 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
1e8b0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1e8c0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
1e8d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e8e0 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64   Allocate a PgHd
1e8f0 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68  r object.   Eith
1e900 65 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  er create a new 
1e910 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20  one or reuse.** 
1e920 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
1e930 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65  that is not othe
1e940 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a  rwise in use..**
1e950 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20  .** A new PgHdr 
1e960 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
1e970 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ated if any of t
1e980 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1e990 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  .** true:.**.** 
1e9a0 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1e9b0 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75   not exceeded ou
1e9c0 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  r maximum alloca
1e9d0 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  ted cache size.*
1e9e0 2a 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65  *          as se
1e9f0 74 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  t by the "PRAGMA
1ea00 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d   cache_size" com
1ea10 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1ea20 28 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (2)  There are n
1ea30 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f  o unused PgHdr o
1ea40 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65  bjects available
1ea50 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a   at this time..*
1ea60 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68  *.**     (3)  Th
1ea70 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1ea80 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1ea90 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72  **     (4)  Ther
1eaa0 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f  e are no PgHdr o
1eab0 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e  bjects that do n
1eac0 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ot require a jou
1ead0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
1eae0 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61   file sync and a
1eaf0 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75   sync of the jou
1eb00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72  rnal file is cur
1eb10 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1eb20 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a     prohibited..*
1eb30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1eb40 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
1eb50 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68  g PgHdr.  In oth
1eb60 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20  er words, reuse 
1eb70 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50  an.** existing P
1eb80 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74  gHdr if all of t
1eb90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1eba0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1ebb0 20 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65   (1)  We have re
1ebc0 61 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65  ached or exceede
1ebd0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61  d the maximum ca
1ebe0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1ebf0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20       allowed by 
1ec00 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1ec10 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ze"..**.**     (
1ec20 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50  2)  There is a P
1ec30 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77  gHdr available w
1ec40 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d  ith PgHdr->nRef=
1ec50 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  =0.**.**     (3)
1ec60 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20    We are not in 
1ec70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1ec80 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  abase.**.**     
1ec90 28 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72  (4)  Either ther
1eca0 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c  e is an availabl
1ecb0 65 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65  e PgHdr that doe
1ecc0 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20  s not need.**   
1ecd0 20 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e         to be syn
1ece0 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65  ced to disk or e
1ecf0 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67  lse disk syncing
1ed00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1ed10 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1ed20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1ed30 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1ed40 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1ed50 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1ed60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ed70 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
1ed80 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  pPg;.  int nByte
1ed90 48 64 72 3b 0a 0a 0a 20 20 2f 2a 20 43 72 65 61  Hdr;...  /* Crea
1eda0 74 65 20 61 20 6e 65 77 20 50 67 48 64 72 20 69  te a new PgHdr i
1edb0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75  f any of the fou
1edc0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66  r conditions def
1edd0 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ined .  ** above
1ede0 20 61 72 65 20 6d 65 74 3a 20 0a 20 20 2a 2f 0a   are met: .  */.
1edf0 20 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c 64    pagerMutexHeld
1ee00 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1ee10 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
1ee20 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
1ee30 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  || pPager->lru.p
1ee40 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
1ee50 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
1ee60 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
1ee70 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
1ee80 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
1ee90 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1eea0 61 74 61 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ata;.    if( pPa
1eeb0 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
1eec0 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
1eed0 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
1eee0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
1eef0 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
1ef00 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
1ef10 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
1ef20 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
1ef30 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
1ef40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1ef50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1ef60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1ef70 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1ef80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ef90 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
1efa0 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79 74  Pager);.    nByt
1efb0 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70  eHdr = sizeof(*p
1efc0 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32  Pg) + sizeof(u32
1efd0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1efe0 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
1eff0 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
1f000 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  PgHistory);.    
1f010 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  pPg = sqlite3_ma
1f020 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20 29  lloc( nByteHdr )
1f030 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
1f040 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73  .      pData = s
1f050 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1f060 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1f070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
1f080 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
1f090 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1f0a0 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 20  g);.        pPg 
1f0b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1f0c0 20 7d 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65   }.    pagerEnte
1f0d0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
1f0e0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1f0f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1f100 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1f110 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1f120 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
1f130 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e 42  emset(pPg, 0, nB
1f140 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50 67  yteHdr);.    pPg
1f150 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
1f160 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1f170 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70   = pPager;.    p
1f180 61 67 65 72 4d 75 74 65 78 48 65 6c 64 28 70 50  agerMutexHeld(pP
1f190 61 67 65 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e  ager);.    pPg->
1f1a0 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
1f1b0 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61  r->pAll;.    pPa
1f1c0 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
1f1d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  .    pPager->nPa
1f1e0 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ge++;.  }else{. 
1f1f0 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
1f200 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77   existing page w
1f210 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63  ith a zero ref-c
1f220 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 70 61 67  ount. */.    pag
1f230 65 72 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  erMutexHeld(pPag
1f240 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
1f250 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
1f260 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
1f270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
1f280 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  SY ){.      rc =
1f290 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
1f2a0 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  OCKED;.    }.   
1f2b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f2c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
1f2d0 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1f2e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
1f2f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f300 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1f310 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1f320 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
1f330 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
1f340 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
1f350 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f360 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
1f370 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
1f380 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
1f390 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
1f3a0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
1f3b0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1f3c0 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
1f3d0 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
1f3e0 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
1f3f0 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
1f400 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
1f410 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
1f420 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
1f430 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
1f440 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
1f450 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
1f460 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
1f470 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
1f480 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
1f490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f4a0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1f4b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1f4c0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
1f4d0 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
1f4e0 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1f4f0 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
1f500 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1f510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f520 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
1f530 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1f540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1f550 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1f560 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f570 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f580 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
1f590 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
1f5a0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
1f5b0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
1f5c0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
1f5d0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
1f5e0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
1f5f0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
1f600 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
1f610 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
1f620 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f630 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
1f640 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
1f650 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
1f660 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1f670 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
1f680 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1f690 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
1f6a0 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
1f6b0 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
1f6c0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
1f6d0 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
1f6e0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
1f6f0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
1f700 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
1f710 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
1f720 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
1f730 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
1f740 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1f750 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
1f760 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
1f770 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
1f780 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
1f790 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
1f7a0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
1f7b0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
1f7c0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
1f7d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f7e0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1f7f0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
1f800 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
1f810 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
1f820 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
1f830 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
1f840 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
1f850 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
1f860 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
1f870 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
1f880 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1f890 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
1f8a0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
1f8b0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
1f8c0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
1f8d0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
1f8e0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
1f8f0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
1f900 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
1f910 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
1f920 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
1f930 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
1f940 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
1f950 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
1f960 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
1f970 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
1f980 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
1f990 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
1f9a0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
1f9b0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
1f9c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
1f9d0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
1f9e0 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
1f9f0 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
1fa00 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
1fa10 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
1fa20 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
1fa30 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
1fa40 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1fa50 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
1fa60 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
1fa70 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
1fa80 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
1fa90 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
1faa0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1fab0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
1fac0 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
1fad0 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
1fae0 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
1faf0 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
1fb00 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1fb10 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
1fb20 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
1fb30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fb40 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1fb50 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
1fb60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
1fb70 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
1fb80 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
1fb90 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
1fba0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
1fbb0 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
1fbc0 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
1fbd0 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
1fbe0 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
1fbf0 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
1fc00 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1fc10 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1fc20 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1fc30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc40 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1fc50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1fc60 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1fc70 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1fc80 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1fc90 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1fca0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1fcb0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1fcc0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1fcd0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1fce0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1fcf0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1fd00 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1fd10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1fd20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1fd30 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1fd40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
1fd50 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
1fd60 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
1fd70 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
1fd80 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
1fd90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1fda0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
1fdb0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1fdc0 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
1fdd0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
1fde0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
1fdf0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
1fe00 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
1fe10 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1fe20 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1fe30 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1fe40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1fe50 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1fe60 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
1fe70 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
1fe80 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
1fe90 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1fea0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
1feb0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1fec0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
1fed0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
1fee0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
1fef0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
1ff00 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
1ff10 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
1ff20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
1ff30 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
1ff40 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1ff50 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1ff60 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
1ff70 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
1ff80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ff90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ffa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ffb0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1ffc0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67  UNLOCK );..  pPg
1ffd0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1ffe0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1fff0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
20000 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
20010 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
20020 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
20030 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  e. */.    int nM
20040 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  ax;.    int h;. 
20050 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
20060 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
20070 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f    rc = pagerAllo
20080 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c  catePage(pPager,
20090 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
200a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
200b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
200c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67  ;.    }..    pPg
200d0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
200e0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
200f0 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72  B || pgno>pPager
20100 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20  ->stmtSize );.  
20110 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
20120 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20130 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
20140 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
20150 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
20160 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65  c = 0;..    make
20170 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
20180 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a  pPg->nRef = 1;..
20190 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
201a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
201b0 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
201c0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
201d0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
201e0 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
201f0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
20200 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73    }.    nMax = s
20210 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
20220 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
20230 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
20240 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72  rCode ){.      r
20250 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
20260 6f 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ode;.      sqlit
20270 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
20280 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20290 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
202a0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
202b0 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
202c0 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
202d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
202e0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
202f0 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
20300 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
20310 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
20320 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
20330 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
20340 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21   (noContent && !
20350 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
20360 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
20370 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
20380 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
20390 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
203a0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
203b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
203c0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
203d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
203e0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
203f0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
20400 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67  Size);.      pPg
20410 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43  ->needRead = noC
20420 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
20430 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
20440 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
20450 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
20460 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
20470 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20480 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
20490 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
204a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
204b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
204c0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
204d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
204e0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
204f0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
20500 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20510 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
20520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20530 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
20540 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
20550 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
20560 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
20570 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
20580 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
20590 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
205a0 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
205b0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
205c0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
205d0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
205e0 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
205f0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
20600 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
20610 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
20620 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
20630 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
20640 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
20650 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
20660 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
20670 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
20680 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
20690 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
206a0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
206b0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
206c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
206d0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
206e0 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
206f0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
20700 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
20710 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
20720 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
20730 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
20740 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
20750 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
20760 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
20770 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
20780 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
20790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
207a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
207b0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
207c0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  }.  *ppPage = pP
207d0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
207e0 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
207f0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
20800 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
20810 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
20820 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
20830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20840 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
20850 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
20860 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
20870 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
20880 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
20890 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
208a0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
208b0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
208c0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
208d0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
208e0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
208f0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
20900 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
20910 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
20920 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
20930 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
20940 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
20950 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  nt);.  pagerLeav
20960 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
20970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
20980 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
20990 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
209a0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
209b0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
209c0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
209d0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
209e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
209f0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
20a00 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
20a10 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
20a20 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
20a30 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20a40 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
20a50 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
20a60 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
20a70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
20a80 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
20a90 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
20aa0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
20ab0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
20ac0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
20ad0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
20ae0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
20af0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
20b00 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
20b10 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
20b20 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
20b30 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
20b40 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
20b50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
20b60 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
20b70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
20b80 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
20b90 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
20ba0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
20bb0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
20bc0 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
20bd0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
20be0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
20bf0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
20c00 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20c10 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65  r->pAll || pPage
20c20 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
20c30 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
20c40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20c50 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
20c60 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
20c70 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
20c80 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  hing */.  }else 
20c90 69 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72  if( (pPg = pager
20ca0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
20cb0 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  pgno))!=0 ){.   
20cc0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
20cd0 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
20ce0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
20cf0 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
20d00 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
20d10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
20d20 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20d30 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
20d40 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
20d50 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
20d60 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
20d70 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
20d80 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
20d90 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
20da0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
20db0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
20dc0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
20dd0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
20de0 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
20df0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20e00 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
20e10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
20e20 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ..  if( pPg==0 )
20e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20e40 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50  K;.  pPager = pP
20e50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
20e60 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
20e70 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
20e80 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
20e90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
20ea0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67  >nRef>0 );.  pag
20eb0 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61  erEnter(pPg->pPa
20ec0 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ger);.  pPg->nRe
20ed0 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  f--;..  CHECK_PA
20ee0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
20ef0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
20f00 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20f10 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
20f20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
20f30 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
20f40 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
20f50 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
20f60 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
20f70 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69  =0 ){..    lruLi
20f80 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20  stAdd(pPg);.    
20f90 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
20fa0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
20fb0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
20fc0 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
20fd0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20fe0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
20ff0 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
21000 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
21010 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
21020 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
21030 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
21050 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
21060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21070 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
21080 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
21090 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
210a0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
210b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
210c0 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
210d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
210e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
210f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
21100 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
21110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21120 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
21130 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
21140 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
21150 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
21160 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
21170 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
21180 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
21190 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
211a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
211b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
211c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
211d0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
211e0 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
211f0 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
21200 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
21210 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
21220 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
21230 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21240 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
21250 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21260 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
21270 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
21280 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
21290 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
212a0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
212b0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
212c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
212d0 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
212e0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
212f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21300 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21310 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
21320 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
21330 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
21340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
21350 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
21360 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21370 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
21380 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
21390 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
213a0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
213b0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
213c0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
213d0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
213e0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
213f0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21400 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
21410 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21420 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
21430 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
21440 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
21450 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
21460 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
21470 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
21480 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
21490 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
214a0 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
214b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
214c0 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  AL);.    }else{.
214d0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
214e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
214f0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
21500 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21510 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
21520 54 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  TE.    rc = sqli
21530 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
21540 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
21550 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
21560 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
21570 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
21580 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  ze(pPager).    )
21590 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
215a0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
215b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
215c0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
215d0 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
215e0 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
215f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21600 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
21610 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
21620 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21630 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
21640 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
21650 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
21660 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
21670 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
216a0 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  EM ){.        sq
216b0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
216c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
216d0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
216e0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  }.      goto fai
216f0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
21700 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nal;.    }.  }. 
21710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21720 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
21730 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
21740 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
21750 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
21760 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
21770 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
21780 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
21790 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
217a0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
217b0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
217c0 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
217d0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
217e0 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
217f0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
21800 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
21810 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
21820 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
21830 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
21840 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
21850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21860 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
21870 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
21880 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
21890 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
218a0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
218b0 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
218c0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
218d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
218e0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
218f0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
21900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
21920 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
21930 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21940 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
21950 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
21960 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
21970 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
21980 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
21990 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
219a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
219b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
219c0 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
219d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
219e0 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
219f0 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
21a00 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
21a10 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
21a20 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
21a30 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
21a40 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64  eTwo() is called
21a50 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
21a60 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
21a70 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
21a80 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
21a90 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
21aa0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
21ab0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
21ac0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
21ad0 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
21ae0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
21af0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
21b00 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
21b10 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
21b20 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
21b30 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
21b40 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
21b50 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
21b60 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
21b70 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
21b80 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
21b90 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
21ba0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
21bb0 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
21bc0 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
21bd0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
21be0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
21bf0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
21c00 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
21c10 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
21c20 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
21c30 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
21c40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21c50 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
21c60 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
21c70 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
21c80 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
21c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21ca0 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
21cb0 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
21cc0 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
21cd0 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
21ce0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
21cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21d00 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
21d10 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
21d20 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
21d30 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
21d40 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
21d50 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21d60 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
21d70 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
21d80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
21d90 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
21da0 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
21db0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
21dc0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
21dd0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
21de0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
21df0 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
21e00 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
21e10 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
21e20 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
21e30 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
21e40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e50 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
21e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21e70 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20  gerBegin(DbPage 
21e80 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67  *pPg, int exFlag
21e90 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
21ea0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
21eb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21ec0 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45  ITE_OK;.  pagerE
21ed0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
21ee0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
21ef0 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
21f00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
21f10 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
21f20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21f30 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
21f40 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
21f50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21f60 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
21f70 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
21f80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
21f90 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
21fa0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
21fb0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
21fc0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
21fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21fe0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
21ff0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
22000 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
22010 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22030 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
22040 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
22050 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
22060 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
22070 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
22080 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
22090 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
220a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
220b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
220c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
220d0 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
220e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
220f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22100 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
22110 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
22120 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  0;.      PAGERTR
22130 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
22140 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
22150 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
22160 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
22170 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
22180 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
22190 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
221a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
221b0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
221c0 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
221d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
221e0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
221f0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
22200 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  }.  }else if( pP
22210 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
22220 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n && pPager->jou
22230 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
22240 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
22250 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  s when the pager
22260 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76   was in exclusiv
22270 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
22280 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
22290 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
222a0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
222b0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
222c0 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
222d0 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
222e0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
222f0 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
22300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
22310 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
22320 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20  open and either 
22330 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
22340 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20   0 bytes or its 
22350 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a  header was.    *
22360 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  * overwritten wi
22370 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
22380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22390 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
223a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
223b0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
223c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
223d0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
223e0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
223f0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
22400 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
22410 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
22420 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
22430 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
22440 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
22450 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
22460 65 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e  e );.    pagerEn
22470 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
22480 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49   if( !pPager->pI
22490 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
224a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
224b0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
224c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
224d0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
224e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
224f0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
22500 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
22510 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
22520 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t( !pPager->jour
22530 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
22540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
22550 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
22560 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
22570 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
22580 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22590 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
225a0 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
225b0 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
225c0 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
225d0 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
225e0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
225f0 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
22600 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
22610 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
22620 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
22630 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
22640 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
22650 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
22660 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
22670 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
22680 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
22690 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
226a0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
226b0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
226c0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
226d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
226e0 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
226f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
22700 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
22710 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
22720 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
22730 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
22740 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
22750 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
22760 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
22770 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
22780 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
22790 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
227a0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
227b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
227c0 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
227d0 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  vDirty==pPg );. 
227e0 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
227f0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
22800 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
22810 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
22820 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
22830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22840 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
22850 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
22860 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
22870 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
22880 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
22890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
228a0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
228b0 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
228c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
228d0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
228e0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
228f0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
22900 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
22910 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
22920 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
22930 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
22940 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
22950 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
22960 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
22970 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
22980 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
22990 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
229a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
229b0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
229c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
229d0 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
229e0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
229f0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
22a00 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22a10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22a20 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
22a30 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
22a40 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
22a50 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
22a60 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
22a70 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
22a80 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
22a90 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
22aa0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
22ab0 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
22ac0 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
22ad0 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
22ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
22af0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
22b00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
22b10 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
22b20 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
22b30 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
22b40 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
22b50 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
22b60 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
22b70 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
22b80 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
22b90 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
22ba0 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
22bb0 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
22bc0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
22bd0 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
22be0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
22bf0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
22c00 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
22c10 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
22c20 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
22c30 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
22c40 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
22c50 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
22c60 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
22c70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
22c80 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
22c90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22ca0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
22cb0 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
22cc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
22cd0 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
22ce0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
22cf0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
22d00 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
22d10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
22d20 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
22d30 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
22d40 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
22d50 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
22d60 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
22d70 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
22d80 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
22d90 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
22da0 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
22db0 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
22dc0 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
22dd0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
22de0 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
22df0 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
22e00 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
22e10 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
22e20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
22e30 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
22e40 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
22e50 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
22e60 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
22e70 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
22e80 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
22e90 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
22ea0 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
22eb0 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
22ec0 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
22ed0 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
22ee0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
22ef0 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
22f00 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
22f10 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
22f20 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
22f30 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
22f40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22f50 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
22f60 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
22f70 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
22f80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22f90 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
22fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
22fb0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
22fc0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
22fd0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
22fe0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
22ff0 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
23000 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
23010 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
23020 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
23030 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
23040 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  he = 1;.    pPag
23050 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
23060 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
23070 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
23080 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
23090 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
230a0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
230b0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
230c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
230d0 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
230e0 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
230f0 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
23100 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
23110 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
23120 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
23130 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
23140 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
23150 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
23160 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
23170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23180 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
23190 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
231a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
231b0 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a  rBegin(pPg, 0);.
231c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
231d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
231e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
231f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23200 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
23210 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
23220 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
23230 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
23240 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  ger->useJournal.
23250 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
23260 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
23270 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
23280 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
23290 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
232a0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
232b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
232c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
232d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
232e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
232f0 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  che = 1;.    pPa
23300 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
23310 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
23320 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
23330 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
23340 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
23350 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
23360 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
23370 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
23380 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
23390 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
233a0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
233b0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
233c0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
233d0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
233e0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
233f0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
23400 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
23410 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
23420 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
23430 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
23440 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
23450 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
23460 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
23470 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
23480 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
23490 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
234a0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
234b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
234c0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
234d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
234e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
234f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
23500 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
23510 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
23520 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
23530 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
23540 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
23550 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
23560 20 69 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72   if( !pHist->pOr
23570 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
23580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23590 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
235a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
235b0 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
235c0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
235d0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
235e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
235f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23600 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
23610 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
23620 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ta2;..          
23630 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
23640 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
23650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
23660 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
23670 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
23680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
23690 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
236a0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
236b0 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
236c0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
236d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
236e0 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
236f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
23700 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
23710 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
23720 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
23730 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
23740 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
23750 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
23760 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
23770 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ta2);.          
23780 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
23790 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
237a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
237b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
237c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
237d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
237e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
237f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
23800 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
23810 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23820 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23850 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
23860 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
23870 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
23880 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
23890 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
238a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
238b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
238c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
238d0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
238e0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
238f0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
23900 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
23910 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23920 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
23930 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49     }.          I
23940 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
23950 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
23960 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
23970 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
23980 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
23990 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
239a0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
239b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49           PAGER_I
239c0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
239d0 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
239e0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
239f0 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20  TRACE5("JOURNAL 
23a00 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
23a10 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
23a20 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
23a30 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
23a40 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
23a50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
23a60 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
23a70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  Pg));..         
23a80 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
23a90 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
23aa0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
23ab0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
23ac0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
23ad0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
23ae0 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
23af0 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
23b00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23b10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23b30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23b40 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
23b50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
23b60 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
23b70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23b80 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
23b90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23ba0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
23bb0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
23bc0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23bd0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
23be0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
23bf0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
23c00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
23c10 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
23c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
23c30 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
23c40 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e  InStmt, pPg->pgn
23c50 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
23c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
23c80 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
23c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
23ca0 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
23cb0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
23cc0 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
23cd0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
23ce0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
23cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23d00 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
23d10 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
23d20 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
23d30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23d40 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
23d50 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
23d60 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
23d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
23d80 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
23d90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
23da0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
23db0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
23dc0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
23dd0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
23de0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
23df0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
23e00 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
23e10 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
23e20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
23e30 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
23e40 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
23e50 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
23e60 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
23e70 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
23e80 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
23e90 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
23ea0 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
23eb0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
23ec0 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
23ed0 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
23ee0 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
23ef0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
23f00 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
23f10 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
23f20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
23f30 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
23f40 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
23f50 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
23f60 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
23f70 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
23f80 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
23f90 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
23fa0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
23fb0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
23fc0 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
23fd0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
23fe0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
23ff0 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
24000 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
24010 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
24020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
24030 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
24040 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
24050 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
24060 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
24070 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
24080 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
24090 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
240a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
240b0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
240c0 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64  .        page_ad
240d0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
240e0 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
240f0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66  {.        i64 of
24100 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  fset = pPager->s
24110 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65  tmtNRec*(4+pPage
24120 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
24130 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
24140 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
24150 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
24160 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
24170 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
24180 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ts(pPager->stfd,
24190 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
241a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
241b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
241c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
241d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
241e0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44  pPager->stfd, pD
241f0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
24200 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
24210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24220 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
24230 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
24240 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
24250 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
24260 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
24270 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24290 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
242a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
242b0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
242c0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
242d0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  t( pPager->pInSt
242e0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
242f0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
24300 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
24310 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
24320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24330 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
24340 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
24350 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
24360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24370 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
24380 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
24390 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
243a0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
243b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
243c0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
243d0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
243e0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
243f0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
24400 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24410 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
24420 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
24430 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24440 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
24450 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24460 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
24470 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
24480 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
24490 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
244a0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
244b0 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
244c0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
244d0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
244e0 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
244f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
24500 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
24510 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
24520 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
24530 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
24540 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
24550 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
24560 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
24570 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
24580 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
24590 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
245a0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
245b0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
245c0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
245d0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
245e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
245f0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
24600 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24610 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24620 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
24630 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
24640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24650 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
24660 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
24670 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
24680 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
24690 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
246a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
246b0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
246c0 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ze);..  pagerEnt
246d0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
246e0 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67  ( !MEMDB && nPag
246f0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
24700 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
24710 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
24720 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
24730 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
24740 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
24750 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
24760 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
24770 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
24780 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
24790 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
247a0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
247b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
247c0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
247d0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
247e0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
247f0 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65  t ii;.    int ne
24800 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
24810 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
24820 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
24830 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
24840 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
24850 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
24860 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
24870 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
24880 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
24890 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
248a0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
248b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
248c0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
248d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
248e0 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
248f0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
24900 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
24910 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
24920 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
24930 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
24940 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
24950 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
24960 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
24970 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
24980 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
24990 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
249a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
249b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
249c0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
249d0 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
249e0 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
249f0 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
24a00 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
24a10 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
24a20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
24a30 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
24a40 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
24a50 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
24a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
24a70 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
24a80 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
24a90 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
24aa0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
24ab0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
24ac0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
24ad0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
24ae0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
24af0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
24b00 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
24b10 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
24b20 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
24b30 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
24b40 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
24b50 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
24b60 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
24b70 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
24b80 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
24b90 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
24ba0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
24bb0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24bc0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24bd0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
24be0 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
24bf0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
24c00 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
24c10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24c20 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
24c30 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
24c40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24c60 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
24c70 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
24c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
24c90 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
24ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
24cb0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24cc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
24ce0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
24cf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24d10 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
24d20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
24d30 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
24d40 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24d50 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
24d60 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
24d70 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
24d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24d90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67      /* If the Pg
24da0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
24db0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
24dc0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
24dd0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
24de0 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
24df0 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
24e00 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
24e10 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
24e20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
24e30 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
24e40 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
24e50 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
24e60 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
24e70 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
24e80 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
24e90 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
24ea0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
24eb0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
24ec0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
24ed0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
24ee0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
24ef0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
24f00 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
24f10 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
24f20 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
24f30 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
24f40 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
24f50 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
24f60 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
24f70 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e  pPage ) pPage->n
24f80 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24f90 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24fa0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
24fb0 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
24fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24fd0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
24fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
24ff0 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
25000 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
25010 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
25020 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
25030 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
25040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25050 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
25060 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
25070 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
25080 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
25090 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
250a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
250b0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
250c0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
250d0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
250e0 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
250f0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
25100 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
25110 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
25120 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
25130 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
25140 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
25150 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
25160 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
25170 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
25180 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
25190 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
251a0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
251b0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
251c0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
251d0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
251e0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
251f0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
25200 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
25210 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
25220 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
25230 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
25240 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
25250 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
25260 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
25270 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
25280 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
25290 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
252a0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
252b0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
252c0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
252d0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
252e0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
252f0 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
25300 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
25310 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
25320 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
25330 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
25340 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
25350 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
25360 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
25370 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
25380 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
25390 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
253a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
253b0 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
253c0 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
253d0 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
253e0 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
253f0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
25400 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
25410 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
25420 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
25430 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
25440 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
25450 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
25460 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
25470 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
25480 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
25490 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
254a0 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
254b0 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
254c0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
254d0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
254e0 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
254f0 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
25500 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
25510 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
25520 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
25530 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
25540 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
25550 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25560 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
25570 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
25580 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
25590 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
255a0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
255b0 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
255c0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
255d0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
255e0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
255f0 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
25600 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
25610 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
25620 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
25630 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
25640 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25650 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
25660 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
25670 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
25680 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
25690 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
256a0 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
256b0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61  B ) return;.  pa
256c0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
256d0 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
256e0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
256f0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
25700 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
25710 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
25720 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25730 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
25740 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
25750 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
25760 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
25770 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
25780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
25790 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
257a0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
257b0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
257c0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
257d0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
257e0 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
257f0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
25800 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
25810 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
25820 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
25830 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
25840 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
25850 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
25860 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
25870 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
25880 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
25890 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
258a0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
258b0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
258c0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
258d0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
258e0 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
258f0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
25900 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
25910 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
25920 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
25930 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
25940 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
25950 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
25960 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
25970 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
25980 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
25990 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
259a0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
259b0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
259c0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
259d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
259e0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
259f0 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
25a00 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
25a10 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b  pgno)).      mak
25a20 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66  eClean(pPg);.#if
25a30 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
25a40 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
25a50 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
25a60 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
25a70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
25a80 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
25a90 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
25aa0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
25ab0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
25ac0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
25ad0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
25ae0 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
25af0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
25b00 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
25b10 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
25b20 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
25b30 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
25b40 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
25b50 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
25b60 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
25b70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
25b80 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
25b90 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
25ba0 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
25bb0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
25bc0 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
25bd0 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
25be0 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
25bf0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
25c00 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
25c10 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
25c20 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
25c30 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
25c40 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
25c50 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
25c60 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
25c70 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
25c80 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
25c90 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
25ca0 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
25cb0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
25cc0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
25cd0 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ger;..  pagerEnt
25ce0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  er(pPager);.  as
25cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25d00 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
25d10 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
25d20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25d30 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
25d40 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25d50 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a   been called on.
25d60 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28    ** this page (
25d70 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73  DontWrite() sets
25d80 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
25d90 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20  ack flag), then 
25da0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
25db0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
25dc0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
25dd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
25de0 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73 52   || pPg->alwaysR
25df0 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
25e00 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
25e10 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c 65  k ){.    pagerLe
25e20 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
25e30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
25e40 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
25e50 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d      /* For a mem
25e60 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  db, pPager->jour
25e70 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79  nalOpen is alway
25e80 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 0 */..#ifdef S
25e90 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
25ea0 45 54 45 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  ETE.  if( pPg->i
25eb0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
25ec0 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20 70 50 61  )pPg->pgno > pPa
25ed0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
25ee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
25ef0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25f00 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  If SECURE_DELETE
25f10 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
25f20 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  en there is no w
25f30 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  ay that this.  *
25f40 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  * routine can be
25f50 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
25f60 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69  e for which sqli
25f70 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
25f80 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e().  ** has not
25f90 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
25fa0 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74   called during t
25fb0 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
25fc0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66  ion..  ** And if
25fd0 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25fe0 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e   previously been
25ff0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c   called, the fol
26000 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64  lowing.  ** cond
26010 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
26020 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
26030 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  t( !pPg->inJourn
26040 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
26050 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
26060 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20  origDbSize );.. 
26070 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26080 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
26090 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
260a0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
260b0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
260c0 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f  no);.  pPg->inJo
260d0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67  urnal = 1;.  pPg
260e0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
260f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26100 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
26110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26120 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  tmtSize >= pPage
26130 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
26140 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
26150 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
26160 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
26170 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  );.  }.  PAGERTR
26180 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
26190 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
261a0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
261b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
261c0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
261d0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
261e0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
261f0 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76  no)).  pagerLeav
26200 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  e(pPager);.}.../
26210 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26220 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
26230 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
26240 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
26250 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
26260 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
26270 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
26280 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26290 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
262a0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
262b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
262c0 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
262d0 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
262e0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
262f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26300 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  _OK;..  if( !pPa
26310 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
26320 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
26330 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
26340 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
26350 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
26360 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26370 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
26380 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
26390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
263a0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
263b0 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
263c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
263d0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
263e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
263f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26410 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
26420 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26430 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26440 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
26450 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
26460 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
26470 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
26480 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
26490 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
264a0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
264b0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
264c0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
264d0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
264e0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
264f0 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
26500 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
26510 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
26520 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
26530 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
26540 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
26550 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
26560 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
26570 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
26580 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26590 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
265a0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
265b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
265c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
265d0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
265e0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
265f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26600 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
26610 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
26620 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
26630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26640 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
26650 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
26660 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
26670 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
26680 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26690 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
266a0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
266b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
266c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
266d0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
266e0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
266f0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
26700 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
26710 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
26720 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
26730 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
26740 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
26750 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
26760 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
26770 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
26780 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
26790 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
267a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
267b0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
267c0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
267d0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
267e0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
267f0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
26800 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
26810 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26820 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
26830 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
26840 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
26850 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
26860 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
26870 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
26880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
26890 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
268a0 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
268b0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
268c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
268d0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
268e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
268f0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
26900 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
26910 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
26920 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
26930 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
26940 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
26950 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
26960 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
26970 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
26980 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
26990 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
269a0 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
269b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
269c0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
269d0 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
269e0 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
269f0 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
26a00 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
26a10 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  abases)..**.** I
26a20 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
26a30 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
26a40 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
26a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a60 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
26a70 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
26a80 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
26a90 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
26aa0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
26ab0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
26ac0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
26ad0 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
26ae0 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
26af0 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
26b00 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
26b10 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
26b20 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26b30 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
26b40 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
26b50 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
26b60 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a  .  Pgno nTrunc,.
26b70 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
26b80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26b90 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  E_OK;..  /* If n
26ba0 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
26bb0 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
26bc0 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
26bd0 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
26be0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
26bf0 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
26c00 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
26c10 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
26c20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26c30 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
26c40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
26c50 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
26c60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26c70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
26c80 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
26c90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
26ca0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26cb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
26cc0 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
26cd0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
26ce0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
26cf0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
26d00 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
26d10 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
26d20 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45  Trunc);.  pagerE
26d30 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  nter(pPager);.. 
26d40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
26d50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
26d60 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
26d70 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
26d80 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
26d90 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
26da0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
26db0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
26dc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
26dd0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
26de0 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
26df0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
26e00 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
26e10 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65  Hdr *pPg;..#ifde
26e20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
26e30 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
26e40 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77   /* The atomic-w
26e50 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
26e60 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
26e70 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20   all of the.    
26e80 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  ** following are
26e90 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   true:.    **.  
26ea0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69    **    + The fi
26eb0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
26ec0 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
26ed0 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
26ee0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
26ef0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
26f00 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a  -size, and.    *
26f10 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d  *    + This comm
26f20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
26f30 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
26f40 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
26f50 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63      **    + Exac
26f60 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
26f70 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
26f80 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
26f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
26fa0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
26fb0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
26fc0 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65  can be used, the
26fd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
26fe0 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20  le will never.  
26ff0 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20    ** be created 
27000 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
27010 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
27020 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72   int useAtomicWr
27030 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  ite = (.        
27040 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20  !zMaster && .   
27050 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
27060 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20  rnalOpen &&.    
27070 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
27080 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
27090 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26  erSize(pPager) &
270a0 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e  & .        nTrun
270b0 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  c==0 && .       
270c0 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69   (0==pPager->pDi
270d0 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  rty || 0==pPager
270e0 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79  ->pDirty->pDirty
270f0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
27100 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
27110 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
27120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
27130 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
27140 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
27150 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
27160 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
27170 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
27180 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
27190 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
271a0 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
271b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
271c0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
271d0 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
271e0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
271f0 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
27200 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
27210 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
27220 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
27230 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
27240 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
27250 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
27260 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
27270 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
27280 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
27290 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
272a0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
272b0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
272c0 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
272d0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
272e0 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
272f0 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
27300 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
27310 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
27320 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
27330 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
27340 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
27350 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
27360 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
27370 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
27380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27390 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
273a0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
273b0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
273c0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
273d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
273e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
273f0 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
27400 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
27410 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
27420 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d  micWrite && rc==
27430 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64  SQLITE_OK ).#end
27440 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
27450 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
27460 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
27470 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
27480 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
27490 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
274a0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
274b0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
274c0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
274d0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
274e0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
274f0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
27500 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
27510 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
27520 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
27530 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
27540 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
27550 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
27560 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
27570 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
27580 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
27590 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
275a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
275b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
275c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
275d0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
275e0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
275f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
27600 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27610 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
27620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27630 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
27640 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
27650 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
27660 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
27670 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
27680 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
27690 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
276a0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
276b0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
276c0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
276d0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
276e0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
276f0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
27700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
27710 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
27720 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
27730 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
27740 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
27750 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
27760 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
27770 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
27780 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
27790 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
277a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
277b0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
277c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
277d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
277e0 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
277f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27810 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27820 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
27830 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27840 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
27850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
27860 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
27870 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27890 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
278a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
278b0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
278c0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
278d0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
278e0 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
278f0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
27900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27910 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27920 20 20 20 20 20 20 70 61 67 65 72 4d 75 74 65 78        pagerMutex
27930 48 65 6c 64 28 70 50 61 67 65 72 29 3b 0a 20 20  Held(pPager);.  
27940 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
27950 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
27960 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
27970 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27980 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66   sync_exit;..#if
27990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
279a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
279b0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
279c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
279d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
279e0 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
279f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
27a00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27a10 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
27a20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
27a30 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
27a40 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
27a50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
27a60 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
27a70 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
27a80 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
27a90 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
27aa0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
27ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
27ad0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
27ae0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
27af0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
27b00 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65  error might have
27b10 20 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20   left the dirty 
27b20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20  list all fouled 
27b30 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a  up here,.      *
27b40 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20  * but that does 
27b50 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75  not matter becau
27b60 73 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65  se if the if the
27b70 20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a   dirty list did.
27b80 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72        ** get cor
27b90 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65  rupted, then the
27ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
27bb0 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a  l roll back and.
27bc0 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64        ** discard
27bd0 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e   the dirty list.
27be0 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73    There is an as
27bf0 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a  sert in.      **
27c00 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
27c10 69 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61  irty_pages() tha
27c20 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  t verifies that 
27c30 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20  no attempt.     
27c40 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75   ** is made to u
27c50 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69  se an invalid di
27c60 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  rty list..      
27c70 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79  */.      goto sy
27c80 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nc_exit;.    }. 
27c90 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
27ca0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
27cb0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
27cc0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
27cd0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
27ce0 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
27cf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27d00 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
27d10 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
27d20 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
27d30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
27d40 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
27d50 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
27d60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27d70 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
27d80 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
27d90 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
27da0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
27db0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
27dc0 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
27dd0 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
27de0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
27df0 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
27e00 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
27e10 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
27e20 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
27e30 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
27e40 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
27e50 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
27e60 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
27e70 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
27e80 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
27e90 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
27ea0 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
27eb0 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
27ec0 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
27ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
27ee0 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
27ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
27f00 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
27f10 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
27f20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
27f30 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
27f40 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
27f50 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
27f60 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
27f70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
27f80 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
27f90 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
27fa0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
27fb0 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
27fc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
27fd0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
27fe0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
27ff0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
28000 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
28010 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
28020 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
28030 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
28040 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
28050 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
28060 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
28070 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28080 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
28090 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
280a0 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
280b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
280c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
280d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
280e0 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a  bModified==0 &&.
280f0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
28100 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
28110 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28120 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20  DELETE ||.      
28130 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
28140 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b  usiveMode!=0) ){
28150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28160 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
28170 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 || pPager->jo
28180 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
28190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
281a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65  E_OK;.  }.  page
281b0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
281c0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
281d0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
281e0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
281f0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
28200 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
28210 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
28220 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
28230 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
28240 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
28250 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
28260 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
28270 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  ;.      clearHis
28280 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
28290 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
282a0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
282b0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
282c0 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
282d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
282e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
282f0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
28300 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
28310 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
28320 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
28330 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
28340 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
28350 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
28360 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
28370 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
28380 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
28390 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
283a0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
283b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
283c0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
283d0 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
283e0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
283f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28400 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
28410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
28420 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
28430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28440 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
28450 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
28460 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
28470 41 52 45 44 3b 0a 20 20 20 20 70 61 67 65 72 4c  ARED;.    pagerL
28480 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
284a0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
284b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
284c0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
284d0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
284e0 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70  ache );.  rc = p
284f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
28500 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
28510 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
28520 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72  .  rc = pager_er
28530 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
28540 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
28550 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
28560 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
28570 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
28580 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
28590 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
285a0 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
285b0 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
285c0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
285d0 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
285e0 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
285f0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
28600 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
28610 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28620 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
28630 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
28640 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
28650 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
28660 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
28670 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75  ng protocol or u
28680 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
28690 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
286a0 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
286b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
286c0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
286d0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
286e0 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
286f0 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
28700 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
28710 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
28720 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
28730 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
28740 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
28750 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
28760 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
28770 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
28780 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
28790 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
287a0 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52  nt rc;.  PAGERTR
287b0 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
287c0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
287d0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
287e0 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
287f0 20 2a 70 3b 0a 20 20 20 20 70 61 67 65 72 4d 75   *p;.    pagerMu
28800 74 65 78 48 65 6c 64 28 70 50 61 67 65 72 29 3b  texHeld(pPager);
28810 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
28820 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
28830 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
28840 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
28850 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
28860 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
28870 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
28880 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
28890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
288a0 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
288b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
288c0 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
288d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
288e0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
288f0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
28900 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
28910 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
28920 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
28930 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
28940 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
28950 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
28960 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
28970 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
28980 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
28990 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
289a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
289b0 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
289c0 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
289d0 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
289e0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
289f0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
28a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28a10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
28a20 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
28a30 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
28a40 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28a50 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
28a60 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
28a70 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
28a80 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
28a90 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
28aa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
28ab0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
28ac0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
28ad0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
28ae0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
28af0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28b00 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
28b10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
28b20 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
28b30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
28b40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
28b50 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
28b60 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
28b70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
28b80 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
28b90 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
28ba0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
28bb0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
28bc0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
28bd0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
28be0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
28bf0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
28c00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28c10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
28c20 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
28c30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
28c40 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
28c50 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
28c60 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
28c70 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28c80 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
28c90 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
28ca0 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  );.    pagerLeav
28cb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
28cc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
28cd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
28ce0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
28cf0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
28d00 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
28d10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
28d20 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
28d30 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
28d40 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
28d50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
28d60 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28d70 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
28d80 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
28d90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
28da0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
28db0 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
28dc0 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
28dd0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
28de0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
28df0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
28e00 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
28e10 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
28e20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
28e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28e40 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
28e50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
28e60 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
28e70 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
28e80 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
28e90 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
28ea0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
28eb0 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
28ec0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
28ed0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
28ee0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
28ef0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
28f00 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
28f10 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
28f20 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
28f30 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
28f40 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
28f50 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
28f60 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
28f70 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
28f80 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28f90 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
28fa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
28fb0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
28fc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
28fd0 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
28fe0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
28ff0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
29000 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
29010 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
29020 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
29030 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
29040 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
29050 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
29060 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
29070 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
29080 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
29090 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
290a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
290b0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
290c0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
290d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d   pPager->nRef;.}
290e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
290f0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
29100 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
29110 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
29120 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
29130 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
29140 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
29150 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
29160 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
29170 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
29180 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
29190 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
291a0 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
291b0 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
291c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
291d0 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
291e0 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
291f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
29200 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
29210 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
29220 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
29230 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
29240 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
29250 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
29260 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
29270 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
29280 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
29290 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69  eturn a;.}.#endi
292a0 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  f../*.** Set the
292b0 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
292c0 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  ack point..**.**
292d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
292e0 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
292f0 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74  ith the transact
29300 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65  ion journal alre
29310 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20  ady.** open.  A 
29320 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  new statement jo
29330 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64  urnal is created
29340 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
29350 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  d to rollback.**
29360 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69   changes of a si
29370 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ngle SQL command
29380 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72   within a larger
29390 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
293a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
293b0 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72  rStmtBegin(Pager
293c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
293d0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
293e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
293f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
29400 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
29410 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
29420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29430 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50  dbSize>=0 );.  P
29440 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
29450 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41  -BEGIN %d\n", PA
29460 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
29470 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
29480 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
29490 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
294a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
294b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
294c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
294d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
294e0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
294f0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
29500 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
29510 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
29520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29530 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
29550 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
29560 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
29570 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
29580 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  t==0 );.  pPager
29590 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->pInStmt = sqli
295a0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
295b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
295c0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
295d0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
295e0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
295f0 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
29600 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
29610 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
29620 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
29630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
29640 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
29650 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
29660 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
29670 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
29680 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
29690 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
296a0 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
296b0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
296c0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
296d0 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
296e0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
296f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29700 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
29710 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
29720 72 2d 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d  r->stfd, pPager-
29730 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20  >zStmtJrnl,.    
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
29760 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
29770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
29780 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74  .      goto stmt
29790 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
297a0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
297b0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
297c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
297d0 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
297e0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
297f0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
29800 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
29810 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
29820 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
29830 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
29840 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
29850 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
29860 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
29870 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
29880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
29890 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
298a0 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
298b0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
298c0 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  c;.  pagerEnter(
298d0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
298e0 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  pagerStmtBegin(p
298f0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c  Pager);.  pagerL
29900 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
29910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29920 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61  .** Commit a sta
29930 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
29940 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
29950 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
29960 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74  ger){.  pagerEnt
29970 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
29980 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
29990 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
299a0 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
299b0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
299c0 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
299d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
299e0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
299f0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
29a00 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
29a10 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
29a20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
29a30 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
29a40 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
29a50 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  t);.      pPager
29a60 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
29a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a80 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
29a90 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
29aa0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
29ab0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
29ac0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
29ad0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
29ae0 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
29af0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b  Hist->pNextStmt;
29b00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29b10 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29   pHist->inStmt )
29b20 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
29b30 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
29b40 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
29b50 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
29b60 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
29b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29b80 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
29b90 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
29ba0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
29bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
29bc0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
29bd0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
29be0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
29bf0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
29c00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
29c10 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
29c20 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61   = 0;.  pagerLea
29c30 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
29c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29c50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
29c60 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
29c70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
29c80 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50  erStmtRollback(P
29c90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29ca0 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
29cb0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
29cc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
29cd0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41  tInUse ){.    PA
29ce0 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
29cf0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
29d00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
29d10 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
29d20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
29d30 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73  pPg;.      PgHis
29d40 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
29d50 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
29d60 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
29d70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  Pg=pHist->pNextS
29d80 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48  tmt){.        pH
29d90 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
29da0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
29db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
29dc0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
29dd0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
29de0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
29df0 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
29e00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29e10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
29e20 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74  lite3_free(pHist
29e30 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
29e40 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
29e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
29e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
29e70 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
29e80 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
29e90 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75  .      pager_tru
29ea0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
29eb0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
29ec0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
29ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
29ee0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
29ef0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
29f00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
29f10 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
29f20 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
29f30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
29f40 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
29f50 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
29f60 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  = 0;.  pagerLeav
29f70 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
29f80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29f90 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
29fa0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
29fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29fc0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
29fd0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
29fe0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
29ff0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2a000 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
2a010 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a020 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
2a030 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
2a040 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
2a050 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
2a060 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
2a070 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2a080 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
2a090 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2a0a0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
2a0b0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2a0c0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
2a0d0 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
2a0e0 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
2a0f0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
2a100 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
2a110 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2a120 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
2a130 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
2a140 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
2a150 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2a160 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
2a170 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72  * Return the dir
2a180 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61  ectory of the da
2a190 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
2a1a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
2a1b0 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
2a1c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2a1d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2a1e0 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
2a1f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2a200 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
2a210 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2a220 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2a230 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
2a240 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
2a250 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2a260 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
2a270 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
2a280 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
2a290 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
2a2a0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
2a2b0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
2a2c0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
2a2d0 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
2a2e0 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
2a2f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a300 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
2a310 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2a320 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
2a330 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2a340 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
2a350 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
2a360 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
2a370 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2a380 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
2a390 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
2a3a0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
2a3b0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
2a3c0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
2a3d0 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
2a3e0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
2a3f0 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
2a400 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
2a410 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ecArg;.}.#endif.
2a420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a430 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a440 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
2a450 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74  age pPg to locat
2a460 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
2a470 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  file..**.** Ther
2a480 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
2a490 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2a4a0 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
2a4b0 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
2a4c0 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
2a4d0 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
2a4e0 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
2a4f0 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
2a500 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
2a510 70 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f  page previous lo
2a520 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73  cated at pgno is
2a530 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
2a540 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
2a550 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
2a560 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20  ot put there by 
2a570 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
2a580 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
2a590 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50  s to the page pP
2a5a0 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  g remain valid. 
2a5b0 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
2a5c0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
2a5d0 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69  ated with pPg (i
2a5e0 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
2a5f0 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
2a600 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
2a610 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2a620 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
2a630 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
2a640 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
2a650 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
2a660 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
2a670 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2a680 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
2a690 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
2a6a0 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
2a6b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
2a6c0 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
2a6d0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
2a6e0 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
2a6f0 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
2a700 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
2a710 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
2a720 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
2a730 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
2a740 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74   active)..*/.int
2a750 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
2a760 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
2a770 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
2a780 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2a790 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
2a7a0 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e  /* The page bein
2a7b0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a  g overwritten. *
2a7c0 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e  /.  int h;.  Pgn
2a7d0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
2a7e0 20 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65   0;..  pagerEnte
2a7f0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  r(pPager);.  ass
2a800 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
2a810 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
2a820 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
2a830 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
2a840 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
2a850 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
2a860 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2a870 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
2a880 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
2a890 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
2a8a0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
2a8b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
2a8c0 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f  ))..  pager_get_
2a8d0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
2a8e0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
2a8f0 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
2a900 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
2a910 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
2a920 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
2a930 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
2a940 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
2a950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
2a960 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
2a970 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a980 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
2a990 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
2a9a0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 2d 63 68  from its hash-ch
2a9b0 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
2a9c0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
2a9d0 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
2a9e0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
2a9f0 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
2aa00 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
2aa10 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
2aa20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
2aa30 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
2aa40 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
2aa50 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
2aa60 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
2aa70 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
2aa80 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
2aa90 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
2aaa0 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
2aab0 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
2aac0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65  ..  */.  pPg->ne
2aad0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
2aae0 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
2aaf0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
2ab00 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
2ab10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ab20 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  PgOld->nRef==0 )
2ab30 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68  ;.    unlinkHash
2ab40 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
2ab50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43  gOld);.    makeC
2ab60 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20  lean(pPgOld);.  
2ab70 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
2ab80 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79  = pPgOld->needSy
2ab90 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nc;.  }else{.   
2aba0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
2abb0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69   0;.  }.  pPg->i
2abc0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
2abd0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
2abe0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2abf0 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68   pgno);..  /* Ch
2ac00 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
2ac10 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
2ac20 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
2ac30 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
2ac40 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
2ac50 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
2ac60 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
2ac70 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
2ac80 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
2ac90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
2aca0 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
2acb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
2acc0 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
2acd0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
2ace0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
2acf0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
2ad00 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
2ad10 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
2ad20 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
2ad30 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
2ad40 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
2ad50 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
2ad60 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
2ad70 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
2ad80 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 1;.  pPager->d
2ad90 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
2ada0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
2adb0 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
2adc0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
2add0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2ade0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2adf0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
2ae00 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
2ae10 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
2ae20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
2ae30 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
2ae40 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
2ae50 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
2ae60 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
2ae70 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
2ae80 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
2ae90 20 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   ** Pager.pInJou
2aea0 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
2aeb0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
2aec0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
2aed0 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
2aee0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
2aef0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
2af00 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
2af10 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
2af20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
2af30 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
2af40 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
2af50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
2af60 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
2af70 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
2af80 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
2af90 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
2afa0 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
2afb0 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
2afc0 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
2afd0 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
2afe0 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
2aff0 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
2b000 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
2b010 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
2b020 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
2b030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2b040 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
2b050 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
2b060 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2b070 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
2b080 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
2b090 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
2b0a0 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
2b0b0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
2b0c0 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
2b0d0 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
2b0e0 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
2b0f0 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
2b100 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
2b110 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
2b120 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
2b130 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
2b140 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
2b150 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
2b160 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
2b170 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b180 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
2b190 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b1a0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
2b1b0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
2b1c0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
2b1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b1e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b1f0 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  pInJournal && (i
2b200 6e 74 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  nt)needSyncPgno<
2b210 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
2b220 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
2b230 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
2b240 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
2b250 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
2b260 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
2b270 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
2b280 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ager);.      ret
2b290 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2b2a0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2b2b0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
2b2c0 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  dr->needSync = 1
2b2d0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e  ;.    pPgHdr->in
2b2e0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
2b2f0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64   makeDirty(pPgHd
2b300 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
2b310 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
2b320 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c  );.  }..  pagerL
2b330 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
2b340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b350 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2b360 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2b370 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
2b380 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
2b390 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
2b3a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
2b3b0 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
2b3c0 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  {.  return PGHDR
2b3d0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
2b3e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2b3f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b400 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
2b410 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
2b420 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
2b430 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
2b440 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2b450 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
2b460 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
2b470 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
2b480 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2b490 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65  Pg->pPager;.  re
2b4a0 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48  turn (pPager?PGH
2b4b0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
2b4c0 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a   pPager):0);.}..
2b4d0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
2b4e0 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
2b4f0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
2b500 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
2b510 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
2b520 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2b530 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
2b540 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2b550 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
2b560 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2b570 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
2b580 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
2b590 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
2b5a0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
2b5b0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
2b5c0 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
2b5d0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
2b5e0 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
2b5f0 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
2b600 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
2b610 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2b620 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
2b630 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
2b640 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
2b650 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
2b660 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
2b670 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
2b680 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
2b690 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
2b6a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
2b6b0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
2b6c0 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
2b6d0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
2b6e0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2b6f0 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
2b700 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2b710 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2b720 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2b730 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2b740 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
2b750 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
2b760 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2b770 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
2b780 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b790 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
2b7a0 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
2b7b0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
2b7c0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
2b7d0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2b7e0 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
2b7f0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
2b800 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2b810 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
2b820 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  t/set the journa
2b830 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  l-mode for this 
2b840 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
2b850 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
2b860 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4a  ne.** of PAGER_J
2b870 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
2b880 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  , PAGER_JOURNALM
2b890 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 20 0a 2a  ODE_DELETE or .*
2b8a0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
2b8b0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 49 66 20  ODE_PERSIST. If 
2b8c0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
2b8d0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
2b8e0 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
2b8f0 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
2b900 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
2b910 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
2b920 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
2b930 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4a 4f   either PAGER_JO
2b940 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
2b950 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   or.** PAGER_JOU
2b960 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
2b970 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
2b980 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
2b990 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a  ly updated).** j
2b9a0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
2b9b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b9c0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
2b9d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
2b9e0 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
2b9f0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
2ba00 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2ba20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2ba30 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
2ba40 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2ba50 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2ba60 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
2ba70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2ba80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2ba90 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
2baa0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
2bab0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
2bac0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
2bad0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bae0 5f 44 45 4c 45 54 45 3e 3d 30 20 26 26 20 50 41  _DELETE>=0 && PA
2baf0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bb00 50 45 52 53 49 53 54 3e 3d 30 20 29 3b 0a 20 20  PERSIST>=0 );.  
2bb10 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a  if( eMode>=0 ){.
2bb20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2bb30 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  nalMode = eMode;
2bb40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
2bb50 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
2bb60 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65  alMode;.}..#ifde
2bb70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
2bb80 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
2bb90 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
2bba0 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
2bbb0 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
2bbc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2bbd0 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
2bbe0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
2bbf0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
2bc00 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
2bc10 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
2bc20 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
2bc30 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
2bc40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bc50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bc60 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
2bc70 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
2bc80 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
2bc90 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
2bca0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
2bcb0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
2bcc0 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
2bcd0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
2bce0 2a 2f 0a                                         */.