/ Hex Artifact Content
Login

Artifact 0cb6ccea4b9615627d61d7c4417cedc45776d429:


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 30  : pager.c,v 1.40
0350: 30 20 32 30 30 37 2f 31 32 2f 31 33 20 32 31 3a  0 2007/12/13 21:
0360: 35 34 3a 31 31 20 64 72 68 20 45 78 70 20 24 0a  54:11 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 28 70 50 61 67 65 72 2d  urnal = (pPager-
24d0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67 6e  >aInJournal[(pgn
24e0: 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28 28  o-1)/8] & (1<<((
24f0: 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a 2a  pgno-1)%8))!=0.*
2500: 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 70 50 61  *.**     The pPa
2510: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
2520: 5d 20 61 72 72 61 79 20 69 73 20 6f 6e 6c 79 20  ] array is only 
2530: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6f 72  valid for the or
2540: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70 61  iginal.**     pa
2550: 67 65 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ges of the datab
2560: 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61 67  ase, not new pag
2570: 65 73 20 74 68 61 74 20 61 72 65 20 61 64 64 65  es that are adde
2580: 64 20 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20  d to the end.** 
2590: 20 20 20 20 6f 66 20 74 68 65 20 64 61 74 61 62      of the datab
25a0: 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73 6c  ase, so obviousl
25b0: 79 20 74 68 65 20 61 62 6f 76 65 20 65 78 70 72  y the above expr
25c0: 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  ession cannot be
25d0: 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64 20 66 6f  .**     valid fo
25e0: 72 20 6e 65 77 20 70 61 67 65 73 2e 20 20 46 6f  r new pages.  Fo
25f0: 72 20 6e 65 77 20 70 61 67 65 73 20 69 6e 4a 6f  r new pages inJo
2600: 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20  urnal is always 
2610: 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a  0..**.** dirty.*
2620: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e 20 74 72  *.**     When tr
2630: 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  ue, this means t
2640: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
2650: 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  of the page has 
2660: 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64 69  been.**     modi
2670: 66 69 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  fied and needs t
2680: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63  o be written bac
2690: 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
26a0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 49  e file..**     I
26b0: 66 20 66 61 6c 73 65 2c 20 69 74 20 6d 65 61 6e  f false, it mean
26c0: 73 20 74 68 61 74 20 65 69 74 68 65 72 20 74 68  s that either th
26d0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
26e0: 20 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 20   page is.**     
26f0: 75 6e 63 68 61 6e 67 65 64 20 6f 72 20 65 6c 73  unchanged or els
2700: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  e the content is
2710: 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e 64   unimportant and
2720: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20   we do not.**   
2730: 20 20 63 61 72 65 20 77 68 65 74 68 65 72 20 6f    care whether o
2740: 72 20 6e 6f 74 20 69 74 20 69 73 20 70 72 65 73  r not it is pres
2750: 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77  erved..**.** alw
2760: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a  aysRollback.**.*
2770: 2a 20 20 20 20 20 54 68 69 73 20 6d 65 61 6e 73  *     This means
2780: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
2790: 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
27a0: 63 6b 28 29 20 41 50 49 20 73 68 6f 75 6c 64 20  ck() API should 
27b0: 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65  be.**     ignore
27c0: 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 2e  d for this page.
27d0: 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61    The DontRollba
27e0: 63 6b 28 29 20 41 50 49 20 61 74 74 65 6d 70 74  ck() API attempt
27f0: 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20 20  s to say.**     
2800: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2810: 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 6e 20   of the page on 
2820: 64 69 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72 74  disk is unimport
2830: 61 6e 74 20 28 69 74 20 69 73 20 61 6e 0a 2a 2a  ant (it is an.**
2840: 20 20 20 20 20 75 6e 75 73 65 64 20 70 61 67 65       unused page
2850: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2860: 29 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  ) so that it is 
2870: 75 6e 6e 65 63 65 73 73 61 72 79 20 74 6f 20 0a  unnecessary to .
2880: 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  **     rollback 
2890: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  changes to this 
28a0: 70 61 67 65 20 62 65 63 61 75 73 65 20 74 68 65  page because the
28b0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
28c0: 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e 20  page.**     can 
28d0: 63 68 61 6e 67 65 20 77 69 74 68 6f 75 74 20 63  change without c
28e0: 68 61 6e 67 69 6e 67 20 74 68 65 20 6d 65 61 6e  hanging the mean
28f0: 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
2900: 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20  ase.  This.**   
2910: 20 20 66 6c 61 67 20 6f 76 65 72 72 69 64 65 73    flag overrides
2920: 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61 63   any DontRollbac
2930: 6b 28 29 20 61 74 74 65 6d 70 74 2e 20 20 54 68  k() attempt.  Th
2940: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a  is flag is set.*
2950: 2a 20 20 20 20 20 77 68 65 6e 20 61 20 70 61 67  *     when a pag
2960: 65 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c  e that originall
2970: 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 69  y contained vali
2980: 64 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  d data is added 
2990: 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72  to.**     the fr
29a0: 65 65 6c 69 73 74 2e 20 20 4c 61 74 65 72 20 69  eelist.  Later i
29b0: 6e 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  n the same trans
29c0: 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 70 61 67  action, this pag
29d0: 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20 62  e might.**     b
29e0: 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68  e pulled from th
29f0: 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 72  e freelist and r
2a00: 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68  eused for someth
2a10: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
2a20: 20 20 20 20 20 61 6e 64 20 61 74 20 74 68 61 74       and at that
2a30: 20 70 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74 52   point the DontR
2a40: 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 77 69  ollback() API wi
2a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 63  ll be called bec
2a60: 61 75 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65  ause.**     page
2a70: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
2a80: 20 66 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f 74   freelist do not
2a90: 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 6f 74   need to be prot
2aa0: 65 63 74 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  ected by.**     
2ab0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
2ac0: 72 6e 61 6c 2e 20 20 42 75 74 20 74 68 69 73 20  rnal.  But this 
2ad0: 66 6c 61 67 20 73 61 79 73 20 74 68 61 74 20 74  flag says that t
2ae0: 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 20  he page was.**  
2af0: 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c     not originall
2b00: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  y part of the fr
2b10: 65 65 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69  eelist so that i
2b20: 74 20 73 74 69 6c 6c 20 6e 65 65 64 73 20 74 6f  t still needs to
2b30: 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c 65  .**     be rolle
2b40: 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
2b50: 6f 66 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e  of any subsequen
2b60: 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  t DontRollback()
2b70: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65   calls..**.** ne
2b80: 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20  edRead .**.**   
2b90: 20 20 54 68 69 73 20 66 6c 61 67 20 6d 65 61 6e    This flag mean
2ba0: 73 20 28 77 68 65 6e 20 74 72 75 65 29 20 74 68  s (when true) th
2bb0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
2bc0: 66 20 74 68 65 20 70 61 67 65 20 68 61 73 0a 2a  f the page has.*
2bd0: 2a 20 20 20 20 20 6e 6f 74 20 79 65 74 20 62 65  *     not yet be
2be0: 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64  en loaded from d
2bf0: 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65 6d  isk.  The in-mem
2c00: 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69 73 20 6a  ory content is j
2c10: 75 73 74 0a 2a 2a 20 20 20 20 20 67 61 72 62 61  ust.**     garba
2c20: 67 65 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c 20  ge.  (Actually, 
2c30: 77 65 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e 74  we zero the cont
2c40: 65 6e 74 2c 20 62 75 74 20 79 6f 75 20 73 68 6f  ent, but you sho
2c50: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d  uld not.**     m
2c60: 61 6b 65 20 61 6e 79 20 61 73 73 75 6d 70 74 69  ake any assumpti
2c70: 6f 6e 73 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ons about the co
2c80: 6e 74 65 6e 74 20 6e 65 76 65 72 74 68 65 6c 65  ntent neverthele
2c90: 73 73 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20  ss.)  If the.** 
2ca0: 20 20 20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e      content is n
2cb0: 65 65 64 65 64 20 69 6e 20 74 68 65 20 66 75 74  eeded in the fut
2cc0: 75 72 65 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ure, it should b
2cd0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 0a  e read from the.
2ce0: 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 20  **     original 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2d00: 2f 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  /.struct PgHdr {
2d10: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d30: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
2d40: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
2d50: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
2d60: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d80: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2d90: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
2da0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
2db0: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
2dc0: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
2dd0: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
2de0: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50  gHdr.pgno */.  P
2df0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66 72 65 65  agerLruLink free
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e10: 20 4e 65 78 74 20 61 6e 64 20 70 72 65 76 69 6f   Next and previo
2e20: 75 73 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  us free pages */
2e30: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
2e40: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2e50: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
2e60: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2e70: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e90: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
2ea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
2eb0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2ec0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2ee0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
2ef0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
2f00: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2f10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f20: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
2f30: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
2f40: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
2f50: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2f60: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
2f70: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
2f80: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
2f90: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2fa0: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc0: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
2fd0: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
2fe0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
2ff0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
3000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3010: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
3020: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
3030: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
3040: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
3050: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
3060: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3070: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
3080: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
3090: 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20 20  LruLink gfree;  
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f            /* Glo
30b0: 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65 66  bal list of nRef
30c0: 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e  ==0 pages */.#en
30d0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30e0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
30f0: 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65  u32 pageHash;.#e
3100: 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a 70 44 61  ndif.  void *pDa
3110: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
3120: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61        /* Page da
3130: 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  ta */.  /* Pager
3140: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
3150: 20 6c 6f 63 61 6c 20 64 61 74 61 20 61 70 70 65   local data appe
3160: 6e 64 65 64 20 74 6f 20 74 68 69 73 20 68 65 61  nded to this hea
3170: 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  der */.};../*.**
3180: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
3190: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
31a0: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
31b0: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
31c0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
31d0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
31e0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
31f0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
3200: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
3210: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
3220: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3230: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
3240: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3250: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
3260: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
3270: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
3280: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3290: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
32a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
32b0: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
32c0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
32d0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
32e0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
32f0: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
3300: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
3310: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
3320: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
3330: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
3340: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
3350: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
3360: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
3370: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
3380: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
3390: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
33a0: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
33b0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
33c0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
33d0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
33e0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
33f0: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
3400: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
3410: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
3420: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
3430: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
3440: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
3450: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
3460: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
3470: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
3480: 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ment */.  PgHdr 
3490: 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72  *pNextStmt, *pPr
34a0: 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74  evStmt;  /* List
34b0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
34c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34d0: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d  al */.  u8 inStm
34e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
34f0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
3500: 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  f in the stateme
3510: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  .};../*.** A mac
3530: 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f  ro used for invo
3540: 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69  king the codec i
3550: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a  f there is one.*
3560: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3570: 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69  HAS_CODEC.# defi
3580: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
3590: 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63  X) if( P->xCodec
35a0: 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63  !=0 ){ P->xCodec
35b0: 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c  (P->pCodecArg,D,
35c0: 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65  N,X); }.# define
35d0: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
35e0: 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f   ((char*)(P->xCo
35f0: 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63  dec!=0?P->xCodec
3600: 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c  (P->pCodecArg,D,
3610: 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23  N,X):D)).#else.#
3620: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
3630: 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50  ,D,N,X) /* NO-OP
3640: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44   */.# define COD
3650: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
3660: 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a  har*)D).#endif..
3670: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
3680: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
3690: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
36a0: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
36b0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
36c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
36d0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 20 20  R_TO_DATA(P)    
36e0: 28 28 50 29 2d 3e 70 44 61 74 61 29 0a 23 64 65  ((P)->pData).#de
36f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
3700: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
3710: 29 26 28 28 47 29 5b 31 5d 29 29 0a 23 64 65 66  )&((G)[1])).#def
3720: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  ine PGHDR_TO_HIS
3730: 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20  T(P,PGR)  \.    
3740: 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74          ((PgHist
3750: 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26  ory*)&((char*)(&
3760: 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e  (P)[1]))[(PGR)->
3770: 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20  nExtra])../*.** 
3780: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
3790: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
37a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
37b0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
37c0: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
37d0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
37e0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
37f0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a  ITE_CORRUPT, or.
3800: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  ** or SQLITE_FUL
3810: 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74  L. Once one of t
3820: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65  he first three e
3830: 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74  rrors occurs, it
3840: 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64   persists.** and
3850: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
3860: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
3870: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
3880: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
3890: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65  * SQLITE_FULL re
38a0: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
38b0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
38c0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
38d0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  y until the.** n
38e0: 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72  ext successful r
38f0: 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f  ollback is perfo
3900: 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  rmed on the page
3910: 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a  r cache. Also,.*
3920: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f  * SQLITE_FULL do
3930: 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
3940: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
3950: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  t() and sqlite3P
3960: 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  agerLookup().** 
3970: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
3980: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
3990: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74  cessfully..*/.st
39a0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
39b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
39c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
39d0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
39e0: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
39f0: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
3a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a10: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
3a20: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
3a30: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
3a40: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
3a50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3a60: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
3a70: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
3a80: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3aa0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3ab0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3ac0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3ad0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3af0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3b00: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3b10: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
3b40: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3b50: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
3b60: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
3b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3b80: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
3b90: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
3ba0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
3bb0: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
3bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
3bd0: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
3be0: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
3bf0: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
3c00: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c20: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
3c30: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
3c40: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c60: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
3c70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
3c80: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
3c90: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
3ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3cb0: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
3cc0: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
3cd0: 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  L */.  u8 state;
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3d00: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3d10: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3d20: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
3d50: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
3d60: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
3d90: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
3da0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3db0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3dc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3dd0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3de0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3df0: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61   */.  u8 dirtyCa
3e00: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
3e10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
3e20: 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63  hed pages have c
3e30: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61  hanged */.  u8 a
3e40: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
3e50: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
3e60: 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  le DontRollback(
3e70: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
3e80: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
3eb0: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
3ec0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
3ed0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3ef0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3f00: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3f10: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
3f20: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3f30: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
3f40: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
3f50: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
3f60: 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69   */.  u8 exclusi
3f70: 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  veMode;         
3f80: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72    /* Boolean. Tr
3f90: 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ue if locking_mo
3fa0: 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f  de==EXCLUSIVE */
3fb0: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
3fc0: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
3fd0: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
3fe0: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
3ff0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
4000: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4020: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
4030: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
4040: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4060: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
4070: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
4080: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
40b0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
40d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
4100: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
4110: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
4120: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4130: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
4140: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
4150: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
4160: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
4170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4180: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4190: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
41a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
41b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
41c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
41d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
41e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
41f0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
4200: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4220: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
4230: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
4240: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
4250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4260: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
4270: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
4280: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
4290: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
42a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
42b0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
42c0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
42d0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
42e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
42f0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
4300: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
4310: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
4320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4330: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
4340: 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48  y pages with PgH
4350: 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69  dr.nRef>0 */.  i
4360: 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20  nt mxPage;      
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
4380: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
4390: 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e  pages to hold in
43a0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
43b0: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
43c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43d0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
43e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
43f0: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72  */.  u8 *aInJour
4400: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4410: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4420: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
4440: 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b  /.  u8 *aInStmt;
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
4470: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4480: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
4490: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
44b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
44c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
44d0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
44f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
4520: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
4530: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
4540: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
4550: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74  s */.  char *zSt
4560: 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20 20 20 20  mtJrnl;         
4570: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4580: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
4590: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  nal file */.  sq
45a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
45b0: 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c  *jfd;     /* Fil
45c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
45d0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
45e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
45f0: 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20  te3_file *stfd; 
4600: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4610: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
4620: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4630: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
4640: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
4650: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
4660: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
4670: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61  yHandler */.  Pa
4680: 67 65 72 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20  gerLruList lru; 
4690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 52 55            /* LRU
46a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
46b0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
46c0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
46d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
46e0: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
46f0: 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20  gHdr *pStmt;    
4700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
4710: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
4720: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4730: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48  journal */.  PgH
4740: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
4750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
4760: 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   of all dirty pa
4770: 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ges */.  i64 jou
4780: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
4790: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
47a0: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
47b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
47c0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
47d0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
47e0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
47f0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
4800: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
4810: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
4820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4830: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
4840: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
4850: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
4860: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
4870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
4880: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
4890: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
48a0: 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ted */.  i64 stm
48b0: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
48c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
48d0: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
48e0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
48f0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
4900: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
4910: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
4920: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
4930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4940: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
4950: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
4960: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
4970: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
4980: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
4990: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
49a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
49b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
49c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
49d0: 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62  *xDestructor)(Db
49e0: 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43  Page*,int); /* C
49f0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
4a00: 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61   when freeing pa
4a10: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
4a20: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
4a30: 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61  e*,int);   /* Ca
4a40: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
4a50: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
4a60: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
4a70: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
4a80: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
4a90: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
4aa0: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
4ab0: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
4ac0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
4ad0: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
4ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4af0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4b00: 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69  Codec() */.#endi
4b10: 66 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20  f.  int nHash;  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
4b40: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4b50: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61  */.  PgHdr **aHa
4b60: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
4b70: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74   /* Hash table t
4b80: 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  o map page numbe
4b90: 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69  r to PgHdr */.#i
4ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4bb0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
4bc0: 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e  MENT.  Pager *pN
4bd0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
4be0: 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e     /* Doubly lin
4bf0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
4c00: 72 73 20 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20  rs on which */. 
4c10: 20 50 61 67 65 72 20 2a 70 50 72 65 76 3b 20 20   Pager *pPrev;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c30: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
4c40: 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f  memory() will wo
4c50: 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55  rk */.  int iInU
4c60: 73 65 4d 4d 3b 20 20 20 20 20 20 20 20 20 20 20  seMM;           
4c70: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
4c80: 69 66 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 74  if unavailable t
4c90: 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  o MM */.  int iI
4ca0: 6e 55 73 65 44 42 3b 20 20 20 20 20 20 20 20 20  nUseDB;         
4cb0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
4cc0: 6f 20 69 66 20 69 6e 20 73 71 6c 69 74 65 33 5f  o if in sqlite3_
4cd0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
4ce0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4cf0: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4d10: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4d20: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4d30: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
4d40: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
4d50: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
4d60: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
4d70: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
4d80: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
4d90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
4da0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
4db0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
4dc0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
4dd0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
4de0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
4df0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
4e00: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
4e10: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
4e20: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
4e30: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
4e40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4e50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
4e60: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
4e70: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4e80: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4e90: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
4ea0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4eb0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
4ec0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
4ed0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4ee0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
4ef0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4f00: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
4f10: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4f20: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
4f30: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
4f40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4f50: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
4f60: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4f70: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
4f80: 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66  s freed */.# def
4f90: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
4fa0: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
4fb0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4fc0: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (v).#endif../*.*
4fd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4fe0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
4ff0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
5000: 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c   double-linked l
5010: 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61  ist.** of all pa
5020: 67 65 72 73 20 74 68 61 74 20 61 72 65 20 65 6c  gers that are el
5030: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67 65 20  igible for page 
5040: 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68 65 0a  stealing by the.
5050: 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  ** sqlite3_relea
5060: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65  se_memory() inte
5070: 72 66 61 63 65 2e 20 20 41 63 63 65 73 73 20 74  rface.  Access t
5080: 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73 0a 2a  o this list is.*
5090: 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  * protected by t
50a0: 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  he SQLITE_MUTEX_
50b0: 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65  STATIC_MEM2 mute
50c0: 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  x..*/.#ifdef SQL
50d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
50e0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61  Y_MANAGEMENT.sta
50f0: 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c 69 74  tic Pager *sqlit
5100: 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 30 3b  e3PagerList = 0;
5110: 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c 72 75  .static PagerLru
5120: 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72 75 50  List sqlite3LruP
5130: 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c  ageList = {0, 0,
5140: 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   0};.#endif.../*
5150: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
5160: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
5170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
5180: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
5190: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
51a0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
51b0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
51c0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
51d0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
51e0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
51f0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
5200: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
5210: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
5220: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
5230: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
5240: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
5250: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
5260: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
5270: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
5280: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
5290: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
52a0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
52b0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
52c0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
52d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
52e0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
52f0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
5300: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
5310: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
5320: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
5330: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
5340: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
5350: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
5360: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
5370: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
5380: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
5390: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
53a0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
53b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
53c0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
53d0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
53e0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
53f0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
5400: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
5410: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
5420: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
5430: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
5440: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
5450: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
5460: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
5470: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
5480: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5490: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
54a0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
54b0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
54c0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
54d0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
54e0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
54f0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
5500: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
5510: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
5520: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
5530: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5540: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5550: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5560: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
5570: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
5580: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
5590: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
55a0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
55b0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
55c0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
55d0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
55e0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
55f0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
5600: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
5610: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
5620: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
5630: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5640: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5650: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5660: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
5680: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
5690: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
56a0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
56b0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
56c0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
56d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
56e0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
56f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
5700: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
5710: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
5720: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
5730: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5740: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5750: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5760: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5770: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5780: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5790: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
57a0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
57b0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
57c0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
57d0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
57e0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
57f0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
5800: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
5810: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
5820: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
5830: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5840: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5850: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5860: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5870: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5880: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5890: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
58a0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
58b0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
58c0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
58d0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
58e0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
58f0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5900: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5910: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5920: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5930: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5940: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5950: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5960: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5970: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5990: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
59a0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
59b0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
59c0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
59d0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
59e0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
59f0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
5a00: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
5a10: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
5a20: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
5a30: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5a40: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5a50: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5a60: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5a70: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5a80: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5a90: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5ab0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5ac0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5ad0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
5ae0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
5af0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
5b00: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
5b10: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
5b20: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5b30: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5b40: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5b50: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5b60: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5b70: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5b90: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5ba0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5bb0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5bc0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5bd0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5be0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5bf0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5c00: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5c10: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
5c20: 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29 20  he pagerEnter() 
5c30: 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28 29  and pagerLeave()
5c40: 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72   routines acquir
5c50: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a  e and release.**
5c60: 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68   a mutex on each
5c70: 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74   pager.  The mut
5c80: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 2e  ex is recursive.
5c90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
5ca0: 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65   special-purpose
5cb0: 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79   mutex.  It only
5cc0: 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c   provides mutual
5cd0: 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65   exclusion.** be
5ce0: 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65 20  tween the Btree 
5cf0: 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d  and the Memory M
5d00: 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65  anagement sqlite
5d10: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
5d20: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  ().** function. 
5d30: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65   It does not pre
5d40: 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  vent, for exampl
5d50: 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66 72  e, two Btrees fr
5d60: 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20  om accessing.** 
5d70: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 61  the same pager a
5d80: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5d90: 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d    Other general-
5da0: 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20  purpose mutexes 
5db0: 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  in.** the btree 
5dc0: 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61  layer handle tha
5dd0: 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64  t chore..*/.#ifd
5de0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5df0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
5e00: 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  NT.  static void
5e10: 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67 65   pagerEnter(Page
5e20: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5e30: 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66  nUseDB++;.    if
5e40: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26  ( p->iInUseMM &&
5e50: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20   p->iInUseDB==1 
5e60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5e70: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5e80: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5e90: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5ea0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5eb0: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
5ec0: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5ed0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5ee0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
5ef0: 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49  ex);.      p->iI
5f00: 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20  nUseDB = 1;.    
5f10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5f20: 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
5f30: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5f40: 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29  p->iInUseMM==0 )
5f50: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
5f60: 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50  oid pagerLeave(P
5f70: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5f80: 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20  >iInUseDB--;.   
5f90: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55   assert( p->iInU
5fa0: 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23  seDB>=0 );.  }.#
5fb0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
5fc0: 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65  gerEnter(X).# de
5fd0: 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28  fine pagerLeave(
5fe0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
5ff0: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
6000: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
6010: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
6020: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
6030: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
6040: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
6050: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
6060: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
6070: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
6080: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
6090: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
60a0: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
60b0: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
60c0: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
60d0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
60e0: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
60f0: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
6100: 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22  %-3d total=%d\n"
6110: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
6120: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
6130: 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e  p), p->nRef, p->
6140: 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20  pPager->nRef.   
6150: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
6160: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
6170: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
6180: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
6190: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
61a0: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
61b0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
61c0: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
61d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61  if../*.** Add pa
61e0: 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 65 6e  ge pPg to the en
61f0: 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  d of the linked 
6200: 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20  list managed by 
6210: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69  structure.** pLi
6220: 73 74 20 28 70 50 67 20 62 65 63 6f 6d 65 73 20  st (pPg becomes 
6230: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
6240: 6e 20 74 68 65 20 6c 69 73 74 20 2d 20 74 68 65  n the list - the
6250: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
6260: 2a 2a 20 75 73 65 64 29 2e 20 41 72 67 75 6d 65  ** used). Argume
6270: 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20  nt pLink should 
6280: 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20  point to either 
6290: 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67  pPg->free or pPg
62a0: 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65  ->gfree,.** depe
62b0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
62c0: 20 70 50 67 20 69 73 20 62 65 69 6e 67 20 61 64   pPg is being ad
62d0: 64 65 64 20 74 6f 20 74 68 65 20 70 61 67 65 72  ded to the pager
62e0: 2d 73 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20  -specific or.** 
62f0: 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e  global LRU list.
6300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6310: 6c 69 73 74 41 64 64 28 50 61 67 65 72 4c 72 75  listAdd(PagerLru
6320: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67  List *pList, Pag
6330: 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b  erLruLink *pLink
6340: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
6350: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLink->pNext = 
6360: 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  0;.  pLink->pPre
6370: 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74  v = pList->pLast
6380: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6390: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
63a0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65  ANAGEMENT.  asse
63b0: 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  rt(pLink==&pPg->
63c0: 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26  free || pLink==&
63d0: 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61  pPg->gfree);.  a
63e0: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
63f0: 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73  g->gfree || pLis
6400: 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61  t!=&sqlite3LruPa
6410: 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  geList);.#endif.
6420: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c  .  if( pList->pL
6430: 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ast ){.    int i
6440: 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c  Off = (char *)pL
6450: 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50  ink - (char *)pP
6460: 67 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c  g;.    PagerLruL
6470: 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d  ink *pLastLink =
6480: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
6490: 29 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d  )(&((u8 *)pList-
64a0: 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a  >pLast)[iOff]);.
64b0: 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70      pLastLink->p
64c0: 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65  Next = pPg;.  }e
64d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
64e0: 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b  !pList->pFirst);
64f0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72  .    pList->pFir
6500: 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20  st = pPg;.  }.. 
6510: 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20   pList->pLast = 
6520: 70 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73  pPg;.  if( !pLis
6530: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
6540: 26 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  && pPg->needSync
6550: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
6560: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
6570: 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pPg;.  }.}../*.
6580: 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67 20 66 72  ** Remove pPg fr
6590: 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61  om the list mana
65a0: 67 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63  ged by the struc
65b0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
65c0: 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  by pList..**.** 
65d0: 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73  Argument pLink s
65e0: 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65  hould point to e
65f0: 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20  ither pPg->free 
6600: 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 20 64  or pPg->gfree, d
6610: 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20  epending .** on 
6620: 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62  whether pPg is b
6630: 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
6640: 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63  e pager-specific
6650: 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c   or global LRU l
6660: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
6670: 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76 65 28 50  oid listRemove(P
6680: 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69  agerLruList *pLi
6690: 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b  st, PagerLruLink
66a0: 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a   *pLink, PgHdr *
66b0: 70 50 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  pPg){.  int iOff
66c0: 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b   = (char *)pLink
66d0: 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a   - (char *)pPg;.
66e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
66f0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
6700: 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74  AGEMENT.  assert
6710: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72  (pLink==&pPg->fr
6720: 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50  ee || pLink==&pP
6730: 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73  g->gfree);.  ass
6740: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6750: 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21  >gfree || pList!
6760: 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  =&sqlite3LruPage
6770: 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  List);.#endif.. 
6780: 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d   if( pPg==pList-
6790: 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70  >pFirst ){.    p
67a0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70  List->pFirst = p
67b0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Link->pNext;.  }
67c0: 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73  .  if( pPg==pLis
67d0: 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  t->pLast ){.    
67e0: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70  pList->pLast = p
67f0: 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  Link->pPrev;.  }
6800: 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50  .  if( pLink->pP
6810: 72 65 76 20 29 7b 0a 20 20 20 20 50 61 67 65 72  rev ){.    Pager
6820: 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69  LruLink *pPrevLi
6830: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
6840: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
6850: 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66  ink->pPrev)[iOff
6860: 5d 29 3b 0a 20 20 20 20 70 50 72 65 76 4c 69 6e  ]);.    pPrevLin
6870: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b  k->pNext = pLink
6880: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
6890: 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  f( pLink->pNext 
68a0: 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c  ){.    PagerLruL
68b0: 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d  ink *pNextLink =
68c0: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
68d0: 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d  )(&((u8 *)pLink-
68e0: 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a  >pNext)[iOff]);.
68f0: 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70      pNextLink->p
6900: 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50  Prev = pLink->pP
6910: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
6920: 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73  Pg==pList->pFirs
6930: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
6940: 67 48 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d  gHdr *p = pLink-
6950: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77 68 69 6c  >pNext;.    whil
6960: 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
6970: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ync ){.      Pag
6980: 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20  erLruLink *pL = 
6990: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
69a0: 28 26 28 28 75 38 20 2a 29 70 29 5b 69 4f 66 66  (&((u8 *)p)[iOff
69b0: 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4c  ]);.      p = pL
69c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
69d0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
69e0: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
69f0: 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  .  pLink->pNext 
6a00: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d  = pLink->pPrev =
6a10: 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64   0;.}../* .** Ad
6a20: 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  d page pPg to th
6a30: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  e list of free p
6a40: 61 67 65 73 20 66 6f 72 20 74 68 65 20 70 61 67  ages for the pag
6a50: 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72  er. If .** memor
6a60: 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
6a70: 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64  enabled, also ad
6a80: 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
6a90: 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73  e global .** lis
6aa0: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e  t of free pages.
6ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ac0: 6c 72 75 4c 69 73 74 41 64 64 28 50 67 48 64 72  lruListAdd(PgHdr
6ad0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64   *pPg){.  listAd
6ae0: 64 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  d(&pPg->pPager->
6af0: 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c  lru, &pPg->free,
6b00: 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51   pPg);.#ifdef SQ
6b10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6b20: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6b30: 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72  if( !pPg->pPager
6b40: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73  ->memDb ){.    s
6b50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
6b60: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
6b70: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
6b80: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6b90: 3b 0a 20 20 20 20 6c 69 73 74 41 64 64 28 26 73  ;.    listAdd(&s
6ba0: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6bb0: 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20  t, &pPg->gfree, 
6bc0: 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPg);.    sqlite
6bd0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
6be0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6bf0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6c00: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d  TATIC_LRU));.  }
6c10: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a  .#endif.}../* .*
6c20: 2a 20 52 65 6d 6f 76 65 20 70 61 67 65 20 70 50  * Remove page pP
6c30: 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  g from the list 
6c40: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 66 6f  of free pages fo
6c50: 72 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  r the associated
6c60: 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65   pager..** If me
6c70: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
6c80: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f  is enabled, also
6c90: 20 72 65 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d   remove pPg from
6ca0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6cb0: 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70 61 67 65  .** of free page
6cc0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
6cd0: 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28  d lruListRemove(
6ce0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c  PgHdr *pPg){.  l
6cf0: 69 73 74 52 65 6d 6f 76 65 28 26 70 50 67 2d 3e  istRemove(&pPg->
6d00: 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50  pPager->lru, &pP
6d10: 67 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23  g->free, pPg);.#
6d20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6d30: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
6d40: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67  EMENT.  if( !pPg
6d50: 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ->pPager->memDb 
6d60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
6d70: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
6d80: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6d90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6da0: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69  IC_LRU));.    li
6db0: 73 74 52 65 6d 6f 76 65 28 26 73 71 6c 69 74 65  stRemove(&sqlite
6dc0: 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70  3LruPageList, &p
6dd0: 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b  Pg->gfree, pPg);
6de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6df0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
6e00: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6e10: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6e20: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6e30: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  if.}../* .** Thi
6e40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
6e50: 6c 6c 65 64 20 6a 75 73 74 20 61 66 74 65 72 20  lled just after 
6e60: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
6e70: 67 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  g has been clear
6e80: 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20 70  ed.** from all p
6e90: 61 67 65 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ages managed by 
6ea0: 70 50 61 67 65 72 20 28 75 73 75 61 6c 6c 79 20  pPager (usually 
6eb0: 62 65 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  because the jour
6ec0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  nal file.** has 
6ed0: 6a 75 73 74 20 62 65 65 6e 20 73 79 6e 63 65 64  just been synced
6ee0: 29 2e 20 49 74 20 75 70 64 61 74 65 73 20 74 68  ). It updates th
6ef0: 65 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  e pPager->lru.pF
6f00: 69 72 73 74 53 79 6e 63 65 64 20 76 61 72 69 61  irstSynced varia
6f10: 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69 66 20 6d  ble.** and, if m
6f20: 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
6f30: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
6f40: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
6f50: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
6f60: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 61 6c 73  .** variable als
6f70: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
6f80: 64 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73  d lruListSetFirs
6f90: 74 53 79 6e 63 65 64 28 50 61 67 65 72 20 2a 70  tSynced(Pager *p
6fa0: 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72  Pager){.  pPager
6fb0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
6fc0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  ed = pPager->lru
6fd0: 2e 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20  .pFirst;.#ifdef 
6fe0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
6ff0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
7000: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
7010: 65 6d 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64  emDb ){.    PgHd
7020: 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  r *p;.    sqlite
7030: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
7040: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
7050: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
7060: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
7070: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 4c 72   for(p=sqlite3Lr
7080: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
7090: 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ; p && p->needSy
70a0: 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65 65 2e 70  nc; p=p->gfree.p
70b0: 4e 65 78 74 29 3b 0a 20 20 20 20 61 73 73 65 72  Next);.    asser
70c0: 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75  t(p==pPager->lru
70d0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 7c 7c  .pFirstSynced ||
70e0: 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72 75 50 61   p==sqlite3LruPa
70f0: 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
7100: 63 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ced);.    sqlite
7110: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
7120: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
7130: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
7140: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
7150: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
7160: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
7170: 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RU));.  }.#endif
7180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7190: 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70   true if page *p
71a0: 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  Pg has already b
71b0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
71c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
71d0: 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74  journal (or stat
71e0: 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68  ement snapshot h
71f0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  as been created,
7200: 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74   if *pPg is part
7210: 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d  .** of an in-mem
7220: 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  ory database)..*
7230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
7240: 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48  eInStatement(PgH
7250: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
7260: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
7270: 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d  >pPager;.  if( M
7280: 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75  EMDB ){.    retu
7290: 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  rn PGHDR_TO_HIST
72a0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69  (pPg, pPager)->i
72b0: 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nStmt;.  }else{.
72c0: 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
72d0: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75  pPg->pgno;.    u
72e0: 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61  8 *a = pPager->a
72f0: 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75  InStmt;.    retu
7300: 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67  rn (a && (int)pg
7310: 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
7320: 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f  Size && (a[pgno/
7330: 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
7340: 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ))));.  }.}../*.
7350: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
7360: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
7370: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e  hash table to N.
7380: 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f    N must be a po
7390: 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a  wer.** of two..*
73a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
73b0: 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
73c0: 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61  table(Pager *pPa
73d0: 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50  ger, int N){.  P
73e0: 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70  gHdr **aHash, *p
73f0: 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  Pg;.  assert( N>
7400: 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d  0 && (N&(N-1))==
7410: 30 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  0 );.  pagerLeav
7420: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  e(pPager);.  sql
7430: 69 74 65 33 4d 61 6c 6c 6f 63 42 65 6e 69 67 6e  ite3MallocBenign
7440: 46 61 69 6c 75 72 65 28 28 69 6e 74 29 70 50 61  Failure((int)pPa
7450: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 61  ger->aHash);.  a
7460: 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Hash = sqlite3Ma
7470: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
7480: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
7490: 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
74a0: 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73  ger);.  if( aHas
74b0: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
74c0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
74d0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
74e0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
74f0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7500: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
7510: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7520: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
7530: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
7540: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
7550: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
7560: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
7570: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7580: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
7590: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
75a0: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
75b0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
75c0: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
75d0: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
75e0: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
75f0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7600: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
7610: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
7620: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
7630: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
7640: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
7650: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
7660: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
7670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
7680: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
7690: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
76a0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
76b0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
76c0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
76d0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
76e0: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
76f0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
7700: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
7710: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
7720: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
7730: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
7740: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
7750: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
7760: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
7770: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
7780: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
7790: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
77a0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
77b0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
77c0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
77d0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
77e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
77f0: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
7800: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
7810: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
7820: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
7830: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7840: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
7850: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
7860: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
7870: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
7880: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
7890: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
78a0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
78b0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
78c0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
78d0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
78e0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
78f0: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
7900: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
7910: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
7920: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7930: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
7940: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
7950: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
7960: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
7970: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
7980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7990: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
79a0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
79b0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
79c0: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
79d0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
79e0: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
79f0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
7a00: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
7a10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
7a20: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
7a30: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
7a40: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
7a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
7a60: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
7a70: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
7a80: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
7a90: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
7aa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7ab0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
7ac0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7ad0: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
7ae0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7af0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
7b00: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7b10: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
7b20: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
7b30: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
7b40: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
7b50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
7b60: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
7b70: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
7b80: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
7b90: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7ba0: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
7bb0: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
7bc0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
7bd0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
7be0: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
7bf0: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
7c00: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
7c10: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
7c20: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
7c30: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
7c40: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
7c50: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
7c60: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
7c70: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
7c80: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
7c90: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
7ca0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7cb0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
7cc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7cd0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
7ce0: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
7cf0: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
7d00: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
7d10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7d20: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
7d30: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
7d40: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
7d50: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
7d60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7d70: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
7d80: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
7d90: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
7da0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
7db0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
7dc0: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
7dd0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7de0: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
7df0: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
7e00: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
7e10: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
7e20: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7e30: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
7e40: 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73  ctor = sqlite3Os
7e50: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
7e60: 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
7e70: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
7e80: 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  }..  assert(SQLI
7e90: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
7ea0: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
7eb0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7ec0: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
7ed0: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20  (65536>>8));..  
7ee0: 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64  if( !fd->pMethod
7ef0: 73 20 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45  s || (dc&(SQLITE
7f00: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e  _IOCAP_ATOMIC|(n
7f10: 50 61 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74  Page>>8))&&nSect
7f20: 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20  or<=nPage) ){.  
7f30: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
7f40: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7f50: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
7f60: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
7f70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
7f80: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
7f90: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
7fa0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
7fb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
7fc0: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
7fd0: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
7fe0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
7ff0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
8000: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
8010: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
8020: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
8030: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
8040: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
8050: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
8060: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8070: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
8080: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8090: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
80a0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
80b0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
80c0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
80d0: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
80e0: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
80f0: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
8100: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
8110: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
8120: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
8130: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
8140: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
8150: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
8160: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
8170: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
8180: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
8190: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
81a0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
81b0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
81c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
81d0: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
81e0: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
81f0: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
8200: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
8210: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
8220: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
8230: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
8240: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
8250: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
8260: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
8270: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
8280: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
8290: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
82a0: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
82b0: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a  o be replayed..*
82c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
82d0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
82e0: 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69   *pPager);.stati
82f0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
8300: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
8310: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
8320: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
8330: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
8340: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
8350: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
8360: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
8370: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
8380: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
8390: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
83a0: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
83b0: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
83c0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
83d0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
83e0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
83f0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
8400: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
8410: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
8420: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
8430: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
8440: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 70  AGER_UNLOCK && p
8450: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
8460: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
8470: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
8480: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
8490: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
84a0: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
84b0: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
84c0: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
84d0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
84e0: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
84f0: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
8500: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
8510: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
8520: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
8530: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
8550: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8560: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
8570: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
8580: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
8590: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
85a0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
85b0: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
85c0: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
85d0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
85e0: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
85f0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
8610: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
8620: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
8630: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
8640: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
8650: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
8660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8670: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
8680: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
8690: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
86a0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
86b0: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
86c0: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
86d0: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
86e0: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
86f0: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
8700: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
8710: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
8720: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
8730: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
8760: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
8770: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
8780: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
8790: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
87a0: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
87b0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
87c0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
87d0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
87e0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
87f0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
8800: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
8810: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
8820: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
8830: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
8840: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
8850: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
8860: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
8870: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
8880: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
8890: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
88a0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
88b0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
88c0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
88d0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
88e0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
88f0: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
8900: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
8910: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
8920: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
8930: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
8940: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
8950: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
8960: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
8970: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
8980: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
8990: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
89a0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
89b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
89c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
89d0: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
89e0: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
89f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8a00: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
8a10: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
8a20: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
8a30: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
8a40: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
8a50: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
8a60: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
8a70: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
8a80: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
8a90: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
8aa0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
8ab0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
8ac0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
8ad0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
8ae0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
8af0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
8b00: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
8b10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8b20: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
8b30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8b40: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
8b50: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
8b60: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
8b70: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
8b80: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
8b90: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
8ba0: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
8bb0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8bc0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
8bd0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
8be0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
8bf0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8c00: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
8c10: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
8c20: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
8c30: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
8c40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8c50: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
8c60: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
8c70: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
8c80: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e  har *zMaster, in
8c90: 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  t nMaster){.  in
8ca0: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
8cb0: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8cc0: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8cd0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8ce0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8cf0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8d00: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8d10: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
8d20: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
8d30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8d40: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
8d50: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8d60: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8d70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8d80: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d90: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8da0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
8db0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8dc0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
8dd0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
8de0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8df0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
8e00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8e10: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
8e20: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
8e30: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8e40: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8e50: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8e60: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
8e70: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
8e80: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
8e90: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8ea0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
8eb0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8ec0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8ed0: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
8ee0: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
8ef0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8f00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8f10: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
8f20: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
8f30: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
8f40: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
8f50: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
8f60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
8f70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
8f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
8f90: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m -= zMaster[i];
8fa0: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
8fb0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
8fc0: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
8fd0: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
8fe0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8ff0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
9000: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
9010: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
9020: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
9030: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
9040: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
9050: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
9060: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
9070: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
9080: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
9090: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
90a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
90b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
90c0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
90d0: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
90e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
90f0: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
9100: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
9110: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
9120: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
9130: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
9140: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
9150: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
9160: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
9170: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
9180: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
9190: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
91a0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
91b0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
91c0: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
91d0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
91e0: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
91f0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
9280: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9290: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
92a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
92b0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
92c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
92d0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
92e0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
92f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
9300: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
9310: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
9320: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9330: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
9340: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9350: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9360: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
9370: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
9380: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
9390: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
93a0: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
93b0: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
93c0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
93d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
93e0: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
93f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
9400: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
9410: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
9420: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
9430: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
9440: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
9450: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
9460: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
9470: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
9480: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
9490: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
94a0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
94b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
94c0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
94d0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
94e0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
94f0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
9500: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
9510: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
9520: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
9530: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
9540: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
9550: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
9560: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
9570: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
9580: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
9590: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
95a0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
95b0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
95c0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
95d0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
95e0: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
95f0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
9600: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
9610: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
9620: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
9630: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
9640: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
9650: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
9660: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9670: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69  lMagic)+16];.  i
9680: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
9690: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
96a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
96b0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
96c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
96d0: 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a  ff;.  }..  seekJ
96e0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
96f0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
9700: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
9710: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9720: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
9730: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
9740: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9750: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
9760: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
9770: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
9780: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
9790: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
97a0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
97b0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
97c0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
97d0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
97e0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
97f0: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
9800: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
9810: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
9820: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
9830: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
9840: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
9850: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
9860: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
9870: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
9880: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
9890: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
98a0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
98b0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
98c0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
98d0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
98e0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
98f0: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
9900: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
9910: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
9920: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
9930: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
9940: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
9950: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
9960: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
9970: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
9980: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
9990: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
99a0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
99b0: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
99c0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
99d0: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
99e0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
99f0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
9a00: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
9a10: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
9a20: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
9a30: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
9a40: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
9a50: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
9a60: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
9a70: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
9a80: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
9a90: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
9aa0: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
9ab0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
9ac0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
9ad0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
9ae0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
9af0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
9b00: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
9b10: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
9b20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
9b30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
9b40: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
9b50: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
9b60: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
9b70: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
9b80: 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20  >noSync) .   || 
9b90: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
9ba0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
9bb0: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
9bc0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
9bd0: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
9be0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9bf0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9c00: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
9c10: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
9c20: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
9c30: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9c40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
9c50: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
9c60: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
9c70: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
9c80: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e  */ .  sqlite3Ran
9c90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9ca0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9cb0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9cc0: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9cd0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9ce0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9cf0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9d00: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9d10: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9d20: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9d30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9d40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9d50: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
9d60: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
9d70: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
9d80: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
9d90: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
9da0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9db0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9dc0: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
9dd0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
9de0: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  );.  IOTRACE(("J
9df0: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9e00: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9e10: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73  r->journalHdr, s
9e20: 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29  izeof(zHeader)))
9e30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
9e40: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9e50: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
9e60: 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 70 50 61  eof(zHeader),pPa
9e70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9e80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9e90: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
9ea0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9eb0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
9ec0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
9ed0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
9ee0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
9ef0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
9f00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9f10: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9f20: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9f30: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
9f40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9f50: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
9f60: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
9f70: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
9f80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
9f90: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
9fa0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9fb0: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
9fc0: 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   1, pPager->jour
9fd0: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 7d 0a 20  nalOff-1);.  }. 
9fe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9ff0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
a000: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
a010: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
a020: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
a030: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
a040: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
a050: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
a060: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
a070: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
a080: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
a090: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
a0a0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
a0b0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
a0c0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
a0d0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
a0e0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
a0f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
a100: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
a110: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
a120: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
a130: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
a140: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
a150: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
a160: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
a170: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
a180: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
a190: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a1a0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a1b0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a1c0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a1d0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a1e0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a1f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a200: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a210: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a220: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a230: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a240: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a250: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a260: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a270: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a280: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a290: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a2a0: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a2b0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a2c0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a2d0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a2e0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a2f0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a300: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a310: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a320: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a330: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a340: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a350: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a360: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a370: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a380: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a390: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a3a0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a3b0: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a3c0: 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61  f;..  seekJourna
a3d0: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
a3e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
a3f0: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
a400: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
a410: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
a420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a430: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e  _DONE;.  }.  jrn
a440: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
a450: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63  ournalOff;..  rc
a460: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a470: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
a480: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
a490: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
a4a0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a4b0: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
a4c0: 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  += sizeof(aMagic
a4d0: 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  );..  if( memcmp
a4e0: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
a4f0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
a500: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
a510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a520: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
a530: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a540: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a550: 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  f, pNRec);.  if(
a560: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a570: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
a580: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a590: 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61   jrnlOff+4, &pPa
a5a0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
a5b0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a5c0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
a5d0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a5e0: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38  ->jfd, jrnlOff+8
a5f0: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
a600: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a610: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
a620: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a630: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a640: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a650: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
a660: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
a670: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
a680: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
a690: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
a6a0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a6b0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a6c0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a6d0: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
a6e0: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
a6f0: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
a700: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
a710: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
a720: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a730: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
a740: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
a750: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
a760: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a770: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a780: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
a790: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a7a0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a7b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
a7c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a7d0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
a7e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
a7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a800: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a810: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a820: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a830: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a840: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a850: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a860: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a870: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a880: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a890: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a8a0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a8b0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a8c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a8d0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a8e0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a8f0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a900: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a910: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a920: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a930: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a940: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a950: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
a960: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
a970: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
a980: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
a990: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a9a0: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
a9b0: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
a9c0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
a9d0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
a9e0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
a9f0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
aa00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
aa10: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
aa20: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
aa30: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
aa40: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
aa50: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
aa60: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
aa70: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
aa80: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
aa90: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
aaa0: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
aab0: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
aac0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
aad0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
aae0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
aaf0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
ab00: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
ab10: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
ab20: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
ab30: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
ab40: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
ab50: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
ab60: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ab70: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
ab80: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
ab90: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
aba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
abb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
abc0: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
abd0: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
abe0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
abf0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
ac00: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
ac10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
ac20: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
ac30: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
ac40: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
ac50: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
ac60: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
ac70: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
ac80: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
ac90: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
aca0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
acb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
acc0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
acd0: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
ace0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
acf0: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
ad00: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
ad10: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
ad20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ad30: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
ad40: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
ad50: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
ad60: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
ad70: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
ad80: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
ad90: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
ada0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
adb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
adc0: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
add0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ade0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
adf0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
ae00: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
ae10: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ae20: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
ae30: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
ae40: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
ae50: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
ae60: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
ae70: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
ae80: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
ae90: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
aea0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
aeb0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
aec0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
aed0: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
aee0: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
aef0: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
af00: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
af10: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65  er->noSync;.  re
af20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
af30: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
af40: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
af50: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
af60: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
af70: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
af80: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
af90: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
afa0: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
afb0: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
afc0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
afd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
afe0: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
aff0: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ps the sqlite3Pa
b000: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a  gerStmtCommit().
b010: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
b020: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
b030: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
b040: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
b050: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
b060: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
b070: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
b080: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
b090: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
b0a0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
b0b0: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
b0c0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b0d0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b0e0: 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79  ger;.  PgHistory
b0f0: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
b100: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
b110: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
b120: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
b130: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  pHist->inStmt ){
b140: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69  .    assert( pHi
b150: 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  st->pPrevStmt==0
b160: 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74   && pHist->pNext
b170: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Stmt==0 );.    i
b180: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
b190: 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f   ){.      PGHDR_
b1a0: 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e  TO_HIST(pPager->
b1b0: 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e  pStmt, pPager)->
b1c0: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
b1d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74  .    }.    pHist
b1e0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
b1f0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ager->pStmt;.   
b200: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b210: 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d   pPg;.    pHist-
b220: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
b230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b240: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b250: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b260: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
b270: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b280: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b290: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
b2a0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b2b0: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b2c0: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b2d0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b2e0: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
b2f0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
b300: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b310: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
b320: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
b330: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
b340: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
b350: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
b360: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
b370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
b390: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b3a0: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
b3b0: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
b3c0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
b3d0: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
b3e0: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
b3f0: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
b400: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
b410: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
b420: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
b430: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
b440: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
b450: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
b460: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
b470: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
b480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b490: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b4a0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
b4b0: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
b4c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b4d0: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
b4e0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
b4f0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
b500: 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52  pNext){.    IOTR
b510: 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
b520: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
b530: 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
b540: 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
b550: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
b560: 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78  count);.    pNex
b570: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
b580: 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65  l;.    lruListRe
b590: 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73  move(pPg);.    s
b5a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
b5b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70  ;.  }.  assert(p
b5c0: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
b5d0: 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t==0);.  assert(
b5e0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
b5f0: 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20  stSynced==0);.  
b600: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b610: 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20  ru.pLast==0);.  
b620: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
b630: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
b640: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
b650: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70  >pDirty = 0;.  p
b660: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
b670: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
b680: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
b690: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
b6a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b6b0: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61  aHash = 0;.  pPa
b6c0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d  ger->nRef = 0;.}
b6d0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
b6e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b6f0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
b700: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
b710: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
b720: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
b730: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
b740: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
b750: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
b760: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
b770: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
b780: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
b790: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
b7a0: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
b7b0: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
b7c0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
b7d0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
b7e0: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
b7f0: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
b800: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
b810: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
b820: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
b830: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
b840: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
b850: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
b860: 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
b870: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
b880: 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
b890: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
b8a0: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
b8b0: 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  ds ){.        os
b8c0: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
b8d0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
b8e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
b8f0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
b900: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
b910: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
b920: 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a  ager))..      /*
b930: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
b940: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
b950: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
b960: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
b970: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75   be.      ** tru
b980: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
b990: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
b9a0: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
b9b0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
b9c0: 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61       ** cache ca
b9d0: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
b9e0: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
b9f0: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
ba00: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ba10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ba20: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
ba30: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
ba40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
ba50: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
ba60: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
ba70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
ba80: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  mtOpen ){.      
ba90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
baa0: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
bab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
bac0: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
bad0: 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >aInStmt);.     
bae0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
baf0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
bb00: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
bb10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bb20: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
bb30: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
bb40: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
bb50: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bb60: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
bb70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bb80: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
bb90: 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
bba0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
bbb0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
bbc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bbd0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
bbe0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
bbf0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
bc00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
bc10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bc20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
bc30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
bc40: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
bc50: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
bc60: 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  toopen = 0;.    
bc70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
bc80: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  DbSize = 0;.    
bc90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
bca0: 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61  f( !MEMDB || pPa
bcb0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bcc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bcd0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
bce0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
bcf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
bd00: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
bd10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
bd20: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
bd30: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
bd40: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
bd50: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
bd60: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
bd70: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
bd80: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
bd90: 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
bda0: 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f  state, .** do no
bdb0: 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f  t attempt the ro
bdc0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
bdd0: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
bde0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
bdf0: 67 65 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ger *p){.  asser
be00: 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  t( p->state>=PAG
be10: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
be20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
be30: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72   );.  if( p->err
be40: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
be50: 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  && p->state>=PAG
be60: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
be70: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
be80: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
be90: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
beb0: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
bec0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
bed0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
bee0: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
bef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
bf00: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
bf10: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
bf20: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
bf30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bf40: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bf50: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
bf60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
bf70: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
bf80: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bf90: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
bfa0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
bfb0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
bfc0: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
bfd0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
bfe0: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
bff0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
c000: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
c010: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
c020: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
c030: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
c040: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
c050: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
c060: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
c070: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
c080: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
c090: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
c0a0: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
c0b0: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
c0c0: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
c0d0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
c0e0: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
c0f0: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
c100: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
c110: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
c120: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
c130: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
c140: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
c150: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
c160: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
c170: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
c180: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
c190: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
c1a0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
c1b0: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
c1c0: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
c1d0: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
c1e0: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
c1f0: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
c200: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
c210: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
c220: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c230: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c240: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c250: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
c260: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c270: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
c280: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c290: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c2a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c2b0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
c2c0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
c2d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c2e0: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
c2f0: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
c300: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
c310: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
c320: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c330: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
c340: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
c350: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
c360: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
c370: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
c380: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c390: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
c3a0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c3b0: 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  de .          &&
c3c0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
c3d0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
c3e0: 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54  >jfd, 0))==SQLIT
c3f0: 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70  E_OK ){;.      p
c400: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c410: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
c420: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
c430: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
c440: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c450: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c460: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
c470: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
c490: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c4a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c4b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
c4c0: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
c4d0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
c4e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c500: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
c510: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
c520: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
c530: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
c540: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
c550: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
c560: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
c570: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
c580: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
c590: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
c5a0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c5b0: 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79        pPg->alway
c5c0: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23  sRollback = 0;.#
c5d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c5e0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
c5f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
c600: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c610: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
c620: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
c630: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
c640: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
c650: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c660: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nRec = 0;.  }el
c670: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
c680: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c690: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
c6a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
c6b0: 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
c6c0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
c6d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
c6e0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c6f0: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
c700: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
c710: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
c720: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
c730: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c740: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
c750: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
c760: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
c770: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
c780: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
c790: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
c7a0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c7b0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
c7c0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
c7d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
c7e0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c  Sync = 0;.  lruL
c7f0: 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
c800: 64 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  d(pPager);.  pPa
c810: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
c820: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
c830: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
c840: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
c850: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
c860: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
c870: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
c880: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
c890: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
c8a0: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
c8b0: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
c8c0: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
c8d0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
c8e0: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
c8f0: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
c900: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
c910: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
c920: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
c930: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
c940: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
c950: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
c960: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
c970: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
c980: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
c990: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
c9a0: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
c9b0: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
c9c0: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
c9d0: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
c9e0: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
c9f0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
ca00: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
ca10: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
ca20: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
ca30: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
ca40: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
ca50: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
ca60: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
ca70: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
ca80: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
ca90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
caa0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
cab0: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
cac0: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
cad0: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
cae0: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
caf0: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
cb00: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
cb10: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
cb20: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
cb30: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
cb40: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
cb50: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
cb60: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
cb70: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
cb80: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
cb90: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
cba0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
cbb0: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
cbc0: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
cbd0: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
cbe0: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
cbf0: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
cc00: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
cc10: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
cc20: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
cc30: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
cc40: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
cc50: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
cc60: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
cc70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
cc80: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
cc90: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
cca0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ccb0: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
ccc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
ccd0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
cce0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
ccf0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
cd00: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
cd10: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
cd20: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
cd30: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
cd40: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
cd50: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
cd60: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
cd70: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
cd80: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
cd90: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
cda0: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
cdb0: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
cdc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
cdd0: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
cde0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
cdf0: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
ce00: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
ce10: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
ce20: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
ce30: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
ce40: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
ce50: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
ce60: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
ce70: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
ce80: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
ce90: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cea0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
ceb0: 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  r, .  sqlite3_fi
cec0: 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f  le *jfd,.  i64 o
ced0: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65  ffset,.  int use
cee0: 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
cef0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
cf20: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
cf30: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
cf40: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
cf50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
cf60: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
cf70: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
cf80: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
cfb0: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
cfc0: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
cfd0: 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50  aData = (u8 *)pP
cfe0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
cff0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
d000: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
d010: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
d020: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
d030: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
d040: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
d050: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
d060: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
d070: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
d080: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
d090: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
d0a0: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
d0b0: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
d0c0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
d0d0: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
d0e0: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   );..  rc = read
d0f0: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
d100: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
d110: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d120: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
d130: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d140: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
d150: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
d160: 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28  offset+4);.  if(
d170: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d180: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
d190: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d1a0: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
d1b0: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
d1c0: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
d1d0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
d1e0: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
d1f0: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
d200: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
d210: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
d220: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
d230: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
d240: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
d250: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
d260: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
d270: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
d280: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
d290: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
d2a0: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
d2b0: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
d2c0: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
d2d0: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
d2e0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
d2f0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
d300: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
d310: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
d320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
d330: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
d340: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
d350: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
d360: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d370: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
d380: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
d390: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
d3a0: 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72  d, offset+pPager
d3b0: 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63  ->pageSize+4, &c
d3c0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
d3d0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d3e0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d3f0: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
d400: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
d410: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
d420: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
d430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
d440: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
d450: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d460: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
d470: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
d480: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
d490: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
d4a0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d4b0: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
d4c0: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
d4d0: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
d4e0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
d4f0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
d500: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
d510: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
d520: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
d530: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
d540: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
d550: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
d560: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
d570: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
d580: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
d590: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
d5a0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d5b0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
d5c0: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
d5d0: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
d5e0: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
d5f0: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
d600: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
d610: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
d620: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
d630: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
d640: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
d650: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
d660: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
d670: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
d680: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
d690: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
d6a0: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
d6b0: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
d6c0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
d6d0: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
d6e0: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
d6f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
d700: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
d710: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
d720: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d730: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
d740: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
d750: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
d760: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
d770: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
d780: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
d790: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
d7a0: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
d7b0: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
d7c0: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
d7d0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
d7e0: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
d7f0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d800: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d810: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
d820: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
d830: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
d840: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
d850: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d860: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
d870: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
d880: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
d890: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
d8a0: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
d8b0: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
d8c0: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
d8d0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
d8e0: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
d8f0: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
d900: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
d910: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
d920: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
d930: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
d940: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
d950: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
d960: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
d970: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
d980: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d990: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
d9a0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
d9b0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
d9c0: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
d9d0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
d9e0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
d9f0: 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
da00: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
da10: 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
da20: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
da30: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
da40: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
da50: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
da60: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
da70: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
da80: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
da90: 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
daa0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
dab0: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
dac0: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
dad0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
dae0: 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
daf0: 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
db00: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
db10: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
db20: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
db30: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
db40: 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42 41  ERTRACE4("PLAYBA
db50: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
db60: 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
db70: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
db80: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
db90: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
dba0: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
dbb0: 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69  ze, aData));.  i
dbc0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
dbd0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
dbe0: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
dbf0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
dc00: 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ) ){.    i64 off
dc10: 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
dc20: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
dc30: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
dc40: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
dc50: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
dc60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
dc70: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
dc80: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
dc90: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
dca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
dcb0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
dcc0: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
dcd0: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
dce0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
dcf0: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
dd00: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
dd10: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
dd20: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
dd30: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
dd40: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
dd50: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
dd60: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
dd70: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
dd80: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
dd90: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
dda0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
ddb0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
ddc0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
ddd0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
dde0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
ddf0: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
de00: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
de10: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
de20: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
de30: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
de40: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
de50: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
de60: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
de70: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
de80: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
de90: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
dea0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
deb0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
dec0: 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
ded0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
dee0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
def0: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
df00: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
df10: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
df20: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
df30: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
df40: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
df50: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
df60: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
df70: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
df80: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
df90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
dfa0: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
dfb0: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
dfc0: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
dfd0: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
dfe0: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
dff0: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
e000: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
e010: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
e020: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
e030: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
e040: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
e050: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
e060: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e070: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
e080: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
e090: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
e0a0: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
e0b0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
e0c0: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
e0d0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
e0e0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
e0f0: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
e100: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
e110: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
e120: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
e130: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
e140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e150: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
e160: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
e170: 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
e180: 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
e190: 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
e1a0: 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
e1b0: 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
e1c0: 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
e1d0: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
e1e0: 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ..**.**.** The m
e1f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e200: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
e210: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
e220: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
e230: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
e240: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
e250: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
e260: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
e270: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
e280: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
e290: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
e2a0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
e2b0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
e2c0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
e2d0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
e2e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
e2f0: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
e300: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
e310: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
e320: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
e330: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
e340: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
e350: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
e360: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
e370: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
e380: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
e390: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
e3a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
e3b0: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
e3c0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
e3d0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
e3e0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
e3f0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
e400: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
e410: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e420: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e430: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
e440: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
e450: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
e460: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
e470: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
e480: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
e490: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
e4a0: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
e4b0: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
e4c0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
e4d0: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
e4e0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
e4f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
e500: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
e510: 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
e520: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
e530: 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
e540: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
e550: 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
e560: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
e570: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
e580: 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  se{.    int flag
e590: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
e5a0: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
e5b0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
e5c0: 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
e5d0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
e5e0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
e5f0: 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
e600: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e610: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e620: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
e630: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
e640: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
e650: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
e660: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
e670: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
e680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e690: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
e6a0: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
e6b0: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
e6c0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
e6d0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e6e0: 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  rPtr = 0;.    in
e6f0: 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70  t nMasterPtr = p
e700: 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
e710: 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20  athname+1;..    
e720: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
e730: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
e740: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
e750: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
e760: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d      ** sqlite3_m
e770: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
e780: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
e790: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
e7a0: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
e7b0: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
e7c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d  qlite3_malloc(nM
e7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
e7e0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
e7f0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
e800: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
e810: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
e820: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
e830: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
e840: 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d      zMasterPtr =
e850: 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
e860: 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
e870: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e880: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
e890: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
e8a0: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
e8b0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
e8c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e8d0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e8e0: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
e8f0: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
e900: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
e910: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
e920: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
e930: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
e940: 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
e950: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
e960: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
e970: 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
e980: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
e990: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
e9a0: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
e9b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
e9c0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
e9d0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
e9e0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
e9f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ea00: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
ea10: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
ea20: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
ea30: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ea40: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
ea50: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
ea60: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
ea70: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
ea80: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
ea90: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
eaa0: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
eab0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
eac0: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
ead0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
eae0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
eaf0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
eb00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
eb10: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
eb20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
eb30: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
eb40: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
eb50: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
eb60: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
eb70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
eb80: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
eb90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
eba0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ebb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
ebc0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
ebd0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
ebe0: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
ebf0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
ec00: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
ec10: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
ec20: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
ec30: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
ec40: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
ec50: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
ec60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
ec70: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
ec80: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
ec90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eca0: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
ecb0: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
ecc0: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
ecd0: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
ece0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
ecf0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
ed00: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
ed10: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
ed20: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
ed30: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
ed40: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
ed50: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
ed60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
ed70: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
ed80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
ed90: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
eda0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
edb0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
edc0: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
edd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
ede0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
edf0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
ee00: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
ee10: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
ee20: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
ee30: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
ee40: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
ee50: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
ee60: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
ee70: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
ee80: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
ee90: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
eea0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
eeb0: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
eec0: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
eed0: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
eee0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
eef0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
ef00: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
ef10: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
ef20: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
ef30: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
ef40: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
ef50: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
ef60: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
ef70: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
ef80: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
ef90: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
efa0: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
efb0: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
efc0: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
efd0: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
efe0: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
eff0: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
f000: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
f010: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
f020: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
f030: 6e 64 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  nd do not do the
f040: 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   truncation..*/.
f050: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
f060: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
f070: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
f080: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
f090: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
f0a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
f0b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
f0c0: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
f0d0: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
f0e0: 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
f0f0: 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  newSize;.    rc 
f100: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
f110: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
f120: 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
f130: 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61     newSize = pPa
f140: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
f150: 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
f160: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f170: 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  && currentSize>n
f180: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
f190: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
f1a0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
f1b0: 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
f1c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
f1d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f1e0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
f1f0: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
f200: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
f210: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
f220: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f230: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
f240: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
f250: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
f260: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
f270: 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65  ize is the large
f280: 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  r of the sector 
f290: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
f2a0: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
f2b0: 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68  torSize() and th
f2c0: 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73  e pageSize..*/.s
f2d0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
f2e0: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
f2f0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
f300: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
f310: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
f320: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
f330: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
f340: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
f350: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
f360: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
f370: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
f380: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
f390: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
f3a0: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
f3b0: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
f3c0: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
f3d0: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
f3e0: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
f3f0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
f400: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
f410: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
f420: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
f430: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
f440: 73 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65  sectorSize<pPage
f450: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
f460: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
f470: 72 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  rSize = pPager->
f480: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a  pageSize;.  }.}.
f490: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
f4a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
f4b0: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
f4c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
f4d0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
f4e0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
f4f0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
f500: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
f510: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
f520: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
f530: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
f540: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
f550: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
f560: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
f570: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
f580: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
f590: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f5a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
f5b0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
f5c0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
f5d0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
f5e0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
f5f0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
f600: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
f610: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
f620: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
f630: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
f640: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
f650: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
f660: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
f670: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
f680: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
f690: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
f6a0: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
f6b0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f6c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
f6d0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
f6e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
f6f0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
f700: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
f710: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
f720: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
f730: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
f740: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
f750: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
f760: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
f770: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
f780: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
f790: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
f7a0: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
f7b0: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
f7c0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
f7d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
f7e0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
f7f0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
f800: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
f810: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
f820: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
f830: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
f840: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
f850: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
f860: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
f870: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
f880: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
f890: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
f8a0: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
f8b0: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
f8c0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
f8d0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
f8e0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
f8f0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
f900: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
f910: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
f920: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
f930: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
f940: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
f950: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
f960: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
f970: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
f980: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
f990: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
f9a0: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
f9b0: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
f9c0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
f9d0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
f9e0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
f9f0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
fa00: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
fa10: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
fa20: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
fa30: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
fa40: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
fa50: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
fa60: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
fa70: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
fa80: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
fa90: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
faa0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
fab0: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
fac0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
fad0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
fae0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
faf0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
fb00: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
fb10: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
fb20: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
fb30: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
fb40: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
fb50: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
fb60: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
fb70: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
fb80: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
fb90: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
fba0: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
fbb0: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
fbc0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
fbd0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
fbe0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
fbf0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
fc00: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
fc10: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
fc20: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
fc30: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
fc40: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
fc50: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
fc60: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
fc70: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
fc80: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
fc90: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
fca0: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
fcb0: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
fcc0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
fcd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
fce0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
fcf0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
fd00: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
fd10: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
fd20: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
fd30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
fd40: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
fd50: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
fd60: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
fd70: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
fd80: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
fd90: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
fda0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fdb0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
fdc0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
fdd0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
fde0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
fdf0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
fe00: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
fe10: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
fe20: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
fe30: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
fe40: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
fe50: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
fe60: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
fe70: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
fe80: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
fe90: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
fea0: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
feb0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
fec0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
fed0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
fee0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
fef0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
ff00: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
ff10: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
ff20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ff30: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
ff40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ff50: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
ff60: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
ff70: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
ff80: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
ff90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
ffa0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
ffb0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
ffc0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffe0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
fff0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
10000 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
10030 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
10040 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
10050 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
10060 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
10070 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
100a0 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
100b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
100c0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
100d0 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
100e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
100f0 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
10100 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
10110 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
10120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
10130 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
10140 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
10150 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
10160 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10170 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
10180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
10190 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
101a0 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
101b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
101c0 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
101d0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
101e0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
101f0 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
10200 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
10210 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
10220 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
10230 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
10240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
10250 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
10260 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
10270 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
10280 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
10290 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
102a0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
102b0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
102c0 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
102d0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
102e0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
102f0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
10300 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
10310 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10320 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
10330 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
10340 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
10350 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
10360 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10370 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72   .   || (zMaster
10380 5b 30 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f  [0] && !sqlite3O
10390 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
103a0 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
103b0 43 45 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20  CESS_EXISTS)) . 
103c0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
103d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
103e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
103f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10400 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10410 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
10420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10430 20 30 3b 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   0;.  zMaster = 
10440 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
10450 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
10460 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
10470 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
10480 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
10490 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
104a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
104b0 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
104c0 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
104d0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
104e0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
104f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
10500 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
10510 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
10520 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
10530 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10540 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
10550 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
10560 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
10570 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
10580 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
10590 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
105a0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
105b0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
105c0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
105d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
105e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
105f0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
10600 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
10610 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
10620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10630 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
10640 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
10650 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10660 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
10670 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
10680 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
10690 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
106a0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
106b0 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
106c0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
106d0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
106e0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
106f0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
10700 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
10710 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10720 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
10730 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
10740 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
10750 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10760 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
10770 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
10780 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
10790 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
107a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
107b0 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
107c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
107d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
107e0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
107f0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
10800 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
10810 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10820 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
10830 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
10840 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
10850 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
10860 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
10870 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
10880 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
10890 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
108a0 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
108b0 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
108c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
108d0 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
108e0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
108f0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
10900 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
10910 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
10920 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
10930 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
10940 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
10950 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
10960 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
10970 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
10980 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
10990 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
109a0 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
109b0 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
109c0 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
109d0 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  565..    */.    
109e0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
109f0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
10a00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10a10 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
10a20 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
10a30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
10a40 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
10a50 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
10a60 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
10a70 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
10a80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10a90 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
10aa0 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
10ab0 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
10ac0 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
10ad0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10ae0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
10af0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
10b00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10b10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10b20 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
10b30 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
10b40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
10b50 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
10b60 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
10b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10b80 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
10b90 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
10ba0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10bb0 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
10bc0 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
10bd0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
10be0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
10bf0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
10c00 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
10c10 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
10c20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
10c30 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
10c40 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
10c50 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10c60 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
10c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
10ca0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
10cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10cc0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
10cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10ce0 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
10cf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
10d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
10d10 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10d30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10d40 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
10d50 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
10d60 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
10d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10d80 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
10d90 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
10da0 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
10db0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
10dc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
10dd0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
10de0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10df0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10e10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
10e20 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
10e30 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
10e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10e50 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
10e60 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
10e70 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
10e80 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
10e90 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
10ea0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
10eb0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
10ec0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
10ed0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10ee0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
10ef0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
10f00 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
10f10 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
10f20 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
10f30 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
10f40 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
10f50 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
10f60 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
10f70 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
10f80 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
10f90 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
10fa0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
10fb0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
10fc0 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
10fd0 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
10fe0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
10ff0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
11000 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11010 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
11020 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11030 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
11040 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
11050 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
11060 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
11070 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
11080 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
11090 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
110a0 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
110b0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
110c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
110d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
110e0 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
110f0 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
11100 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
11110 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
11120 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
11130 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
11140 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
11150 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
11160 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
11170 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11180 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
11190 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
111a0 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
111b0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
111c0 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
111d0 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
111e0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
111f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11200 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
11210 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
11220 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11240 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
11250 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
11260 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
11270 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
11280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11290 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
112a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
112b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
112c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
112d0 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
112e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112f0 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
11300 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
11310 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
11320 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11330 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11340 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
11350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11360 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
11370 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
11380 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
11390 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
113a0 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
113b0 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
113c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
113d0 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
113e0 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
113f0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
11400 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
11410 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
11420 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
11430 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
11440 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
11450 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
11460 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
11470 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
11480 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
11490 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
114a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
114b0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
114c0 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
114d0 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
114e0 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
114f0 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
11500 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
11510 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
11520 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
11530 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
11540 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
11550 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
11560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11570 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11580 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
11590 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
115a0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
115b0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
115c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
115d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
115e0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
115f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11600 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61   );.  nRec = pPa
11610 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
11620 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
11630 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
11640 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
11650 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
11660 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
11670 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
11680 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
11690 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
116a0 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
116b0 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
116c0 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
116d0 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
116e0 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
116f0 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
11700 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
11710 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11720 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
11730 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a   i64 offset = i*
11740 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
11750 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ize);.    rc = p
11760 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
11770 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
11780 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
11790 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  set, 0);.    ass
117a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
117b0 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
117c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
117d0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
117e0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
117f0 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
11800 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
11810 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11820 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
11830 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
11840 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
11850 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
11860 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
11870 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
11880 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
11890 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
118a0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
118b0 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
118c0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
118d0 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
118e0 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
118f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
11900 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
11910 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
11920 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
11930 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
11940 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
11950 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
11960 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
11970 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
11980 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
11990 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
119a0 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  lOff = pPager->s
119b0 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67  tmtJSize;.  pPag
119c0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20  er->cksumInit = 
119d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
119e0 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  m;.  while( pPag
119f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
11a00 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72   hdrOff ){.    r
11a10 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
11a20 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
11a30 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
11a40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11a50 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  Off, 1);.    ass
11a60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11a70 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
11a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11a90 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
11aa0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
11ab0 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
11ac0 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
11ad0 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
11ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11af0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
11b00 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
11b10 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
11b20 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
11b30 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
11b40 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
11b50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
11b70 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11b80 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
11b90 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
11ba0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
11bb0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
11bc0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
11bd0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
11be0 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
11bf0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
11c00 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11c10 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  =nJRec-1; i>=0 &
11c20 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
11c30 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
11c40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
11c50 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
11c60 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
11c70 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11c80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
11c90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11ca0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
11cb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11cd0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11ce0 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
11cf0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11d00 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
11d10 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
11d20 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
11d30 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
11d40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11d50 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
11d60 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
11d70 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
11d80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11d90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11da0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11db0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
11dc0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
11dd0 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
11de0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
11df0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
11e00 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
11e10 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
11e20 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
11e30 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
11e40 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
11e50 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
11e60 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
11e70 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
11e80 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
11e90 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
11ea0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
11eb0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
11ec0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
11ed0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
11ee0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
11ef0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
11f00 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11f10 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
11f20 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
11f30 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
11f40 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
11f50 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
11f60 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
11f70 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
11f80 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
11f90 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
11fa0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
11fb0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
11fc0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
11fd0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
11fe0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
11ff0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12000 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
12010 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
12020 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
12030 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
12040 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
12050 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
12060 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
12070 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
12080 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
12090 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
120a0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
120b0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
120c0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
120d0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
120e0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
120f0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
12100 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
12110 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
12120 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
12130 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
12140 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
12150 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
12160 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
12170 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
12180 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
12190 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
121a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
121b0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
121c0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
121d0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
121e0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
121f0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
12200 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
12220 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
12230 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
12240 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
12250 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
12260 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
12270 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
12280 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
12290 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
122a0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
122b0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
122c0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
122d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
122e0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
122f0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12300 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
12310 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
12320 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
12330 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12340 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
12350 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
12360 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
12370 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12380 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
12390 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
123a0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
123b0 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
123c0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
123d0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
123e0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
123f0 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
12400 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12410 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
12420 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
12430 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
12440 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
12450 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75  sync_flags = (fu
12460 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f  ll_fsync?SQLITE_
12470 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45  SYNC_FULL:SQLITE
12480 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
12490 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
124a0 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
124b0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
124c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
124d0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
124e0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
124f0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
12500 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
12510 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
12520 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
12530 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
12540 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
12550 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
12560 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
12570 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
12580 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
12590 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
125a0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
125b0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
125c0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
125d0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
125e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
125f0 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
12600 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
12610 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
12620 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
12630 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
12640 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
12650 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
12660 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  e temporary.** f
12670 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
12680 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
12690 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
126a0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c  rOpentemp(.  sql
126b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
126c0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
126d0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61  l file system la
126e0 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  yer */.  sqlite3
126f0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
12700 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
12710 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
12720 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
12730 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
12740 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ame of the file.
12750 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
12760 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12770 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
12780 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
12790 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
127a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
127b0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
127c0 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  e!=0 );..#ifdef 
127d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
127e0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
127f0 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
12800 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
12810 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
12820 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
12830 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
12840 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
12850 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
12860 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
12870 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
12880 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
12890 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
128a0 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
128b0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
128c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65  zFilename, pFile
128d0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
128e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
128f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65  LITE_OK || pFile
12900 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
12910 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12920 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
12930 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
12940 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
12950 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
12960 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
12970 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
12980 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
12990 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
129a0 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
129b0 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
129c0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
129d0 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69  PagerGet() and i
129e0 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
129f0 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
12a00 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
12a10 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
12a20 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
12a30 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
12a40 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
12a50 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
12a60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
12a70 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
12a80 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
12a90 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
12aa0 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
12ab0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
12ac0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
12ad0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
12ae0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
12af0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
12b00 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  hen all informat
12b10 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
12b20 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  ache..** It is n
12b30 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
12b40 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20  disk.  This can 
12b50 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
12b60 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65  ment an.** in-me
12b70 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
12b80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12b90 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
12ba0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12bb0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
12bc0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
12bd0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
12be0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
12bf0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12c00 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
12c10 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
12c20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12c30 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
12c40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12c50 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
12c60 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
12c70 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
12c80 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
12c90 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
12ca0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
12cb0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
12cc0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
12cd0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
12ce0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
12cf0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
12d00 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
12d10 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
12d20 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12d30 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
12d40 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
12d50 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
12d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12d70 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
12d80 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65  le = 0;.  int me
12d90 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  mDb = 0;.  int r
12da0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69  eadOnly = 0;.  i
12db0 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
12dc0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
12dd0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
12de0 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
12df0 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
12e00 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
12e10 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61  =0;.  int journa
12e20 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
12e30 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
12e40 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66  Vfs);.  int nDef
12e50 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
12e60 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
12e70 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  IZE;.  char *zPa
12e80 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50  thname;.  int nP
12e90 61 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54  athname;..  /* T
12ea0 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
12eb0 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
12ec0 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
12ed0 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
12ee0 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61  pute the full pa
12ef0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74  thname */.  nPat
12f00 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12f10 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50  Pathname+1;.  zP
12f20 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12f30 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  3_malloc(nPathna
12f40 6d 65 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  me);.  if( zPath
12f50 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
12f60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12f70 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
12f80 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
12f90 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
12fa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12fb0 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
12fc0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
12fd0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
12fe0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
12ff0 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
13000 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
13010 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13020 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
13030 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
13040 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
13050 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
13060 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
13070 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
13080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74  c = sqlite3OsGet
13090 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e  Tempname(pVfs, n
130a0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
130b0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
130c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
130d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
130e0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
130f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13100 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73  .  nPathname = s
13110 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29  trlen(zPathname)
13120 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
13130 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
13140 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
13150 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
13160 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13170 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
13180 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
13190 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
131a0 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ure */.    journ
131b0 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20  alFileSize +    
131c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
131d0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63  urnal file struc
131e0 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66  ture */ .    pVf
131f0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20  s->szOsFile * 2 
13200 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  +        /* The 
13210 64 62 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72  db and stmt jour
13220 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
13230 20 20 34 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20    4*nPathname + 
13240 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  40            /*
13250 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72   zFilename, zDir
13260 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c  ectory, zJournal
13270 2c 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20  , zStmtJrnl */. 
13280 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
13290 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
132a0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
132b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
132c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
132d0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70   pPtr = (u8 *)&p
132e0 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
132f0 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
13300 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65  fsFlags;.  pPage
13310 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
13320 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
13330 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
13340 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d    pPager->stfd =
13350 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
13360 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
13370 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65  File*1];.  pPage
13380 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
13390 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
133a0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
133b0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
133c0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
133d0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
133e0 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  le*2+journalFile
133f0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
13400 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
13410 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13420 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
13430 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
13440 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
13450 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d  rectory[nPathnam
13460 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
13470 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61  zStmtJrnl = &pPa
13480 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
13490 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70  athname+10];.  p
134a0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
134b0 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  fs;.  memcpy(pPa
134c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
134d0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
134e0 6e 61 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74  name+1);.  sqlit
134f0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
13500 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  e);..  /* Open t
13510 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
13520 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13530 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
13540 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
13550 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
13560 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
13570 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
13580 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
13590 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
135a0 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
135b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
135c0 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
135d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
135e0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
135f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
13600 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13630 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
13640 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
13650 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
13660 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
13670 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
13680 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
13690 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
136a0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
136b0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
136c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
136d0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
136e0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
136f0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
13700 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
13710 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
13720 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
13730 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13740 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
13750 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
13760 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
13770 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13780 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
13790 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
137a0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
137b0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
137c0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
137d0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
137e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
137f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13800 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
13810 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
13820 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
13830 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
13840 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
13850 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
13860 61 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20  age<iSectorSize 
13870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
13880 66 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63  faultPage = iSec
13890 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
138a0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
138b0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
138c0 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
138d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
138e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
138f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
13900 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
13910 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
13920 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13930 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
13940 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
13950 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
13960 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
13970 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
13980 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
13990 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
139a0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
139b0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
139c0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
139d0 69 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b  ii=nDefaultPage;
139e0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
139f0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
13a00 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
13a10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
13a20 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
13a30 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
13a40 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
13a50 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
13a60 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
13a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
13a80 66 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45  faultPage>SQLITE
13a90 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
13aa0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
13ab0 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65      nDefaultPage
13ac0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
13ad0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13af0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
13b00 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
13b10 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
13b20 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
13b30 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
13b40 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
13b50 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
13b60 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
13b70 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
13b80 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
13b90 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
13ba0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
13bb0 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
13bc0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
13bd0 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a  rite()..    */ .
13be0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
13bf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
13c00 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
13c10 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
13c20 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
13c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13c40 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
13c50 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ce = (char *)sql
13c60 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66  ite3_malloc(nDef
13c70 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  aultPage);.  }..
13c80 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
13c90 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
13ca0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
13cb0 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
13cc0 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
13cd0 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
13ce0 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
13cf0 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
13d00 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
13d10 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
13d20 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
13d30 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
13d40 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
13d50 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
13d60 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
13d70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
13d80 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13d90 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
13da0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
13db0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
13dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
13dd0 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
13de0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
13df0 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
13e00 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
13e10 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
13e20 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
13e30 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
13e40 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
13e50 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
13e60 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
13e70 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
13e80 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
13e90 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
13ea0 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
13eb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
13ec0 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
13ed0 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
13ee0 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
13ef0 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
13f00 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
13f10 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
13f20 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
13f30 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
13f40 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
13f50 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
13f60 20 61 6e 64 20 50 61 67 65 72 2e 7a 53 74 6d 74   and Pager.zStmt
13f70 4a 72 6e 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  Jrnl[] */.  memc
13f80 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
13f90 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
13fa0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
13fb0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
13fc0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
13fd0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
13fe0 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 6d 65 6d  rnal", 9);.  mem
13ff0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d  cpy(pPager->zStm
14000 74 4a 72 6e 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  tJrnl, pPager->z
14010 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
14020 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ame);.  memcpy(&
14030 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
14040 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
14050 73 74 6d 74 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a  stmtjrnl", 10);.
14060 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
14070 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
14080 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
14090 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
140a0 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
140b0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
140c0 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
140d0 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
140e0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
140f0 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
14100 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
14110 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
14120 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
14130 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
14140 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
14150 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
14160 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61  ize = nDefaultPa
14170 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ge;.  /* pPager-
14180 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
14190 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
141a0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
141b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
141c0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
141d0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
141e0 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
141f0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
14200 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
14210 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
14220 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
14230 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
14240 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
14250 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
14260 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
14270 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
14280 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
14290 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
142a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
142b0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
142c0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
142d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
142e0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
142f0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
14300 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
14310 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
14320 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
14330 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
14340 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
14350 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14360 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
14370 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
14380 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
14390 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
143a0 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
143b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
143c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
143d0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
143e0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
143f0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
14400 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
14410 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
14420 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
14430 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
14440 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
14450 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
14460 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
14470 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14480 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
14490 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
144a0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
144b0 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
144c0 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
144d0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  a);.  assert(pPa
144e0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
144f0 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69  s||memDb||tempFi
14500 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  le);.  if( !memD
14510 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74  b ){.    setSect
14520 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
14530 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
14540 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
14550 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
14560 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
14570 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
14580 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
14590 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
145a0 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
145b0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
145c0 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
145d0 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
145e0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  0;.  pPager->iIn
145f0 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28  UseDB = 0;.  if(
14600 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
14610 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
14620 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
14630 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
14640 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
14650 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  M2);.    sqlite3
14660 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14670 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ex);.    pPager-
14680 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  >pNext = sqlite3
14690 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69  PagerList;.    i
146a0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  f( sqlite3PagerL
146b0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ist ){.      ass
146c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
146d0 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20  rList->pPrev==0 
146e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
146f0 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
14700 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d   = pPager;.    }
14710 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72  .    pPager->pPr
14720 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ev = 0;.    sqli
14730 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70  te3PagerList = p
14740 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
14750 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14760 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  utex);.  }.#endi
14770 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
14780 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
14790 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
147a0 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
147b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
147c0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
147d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
147e0 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
147f0 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
14800 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
14810 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
14820 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
14830 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
14840 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
14850 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
14860 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
14870 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
14880 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
14890 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
148a0 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
148b0 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
148c0 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
148d0 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
148e0 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
148f0 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
14900 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
14910 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
14920 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
14930 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
14940 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
14950 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
14960 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
14970 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
14980 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
14990 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
149a0 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
149b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
149c0 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
149d0 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
149e0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
149f0 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
14a00 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
14a10 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
14a20 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
14a30 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
14a40 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
14a50 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
14a60 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
14a70 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
14a80 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
14a90 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
14aa0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
14ab0 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
14ac0 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
14ad0 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
14ae0 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
14af0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
14b00 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
14b10 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
14b20 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
14b30 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
14b40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
14b50 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
14b60 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
14b70 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
14b80 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
14b90 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
14ba0 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
14bb0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
14bc0 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
14bd0 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
14be0 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
14bf0 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
14c00 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
14c10 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
14c20 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
14c30 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
14c40 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
14c50 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
14c60 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
14c70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
14c80 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
14c90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14ca0 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
14cb0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
14cc0 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
14cd0 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
14ce0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
14cf0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
14d00 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70  SIZE) );.  if( p
14d10 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
14d20 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
14d30 65 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50  eSize .   && !pP
14d40 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
14d50 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a  Pager->nRef==0 .
14d60 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
14d70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
14d80 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67  lite3_malloc(pag
14d90 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
14da0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !pNew ){.      r
14db0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14dd0 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
14de0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ager);.      pag
14df0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
14e00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
14e10 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
14e20 69 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65  ize;.      setSe
14e30 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14e40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14e50 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  free(pPager->pTm
14e60 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
14e70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14e80 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
14e90 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
14ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
14eb0 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
14ec0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
14ed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14ee0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
14ef0 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
14f00 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
14f10 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
14f20 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
14f30 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
14f40 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
14f50 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
14f60 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
14f70 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
14f80 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
14f90 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
14fa0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
14fb0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
14fc0 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
14fd0 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
14fe0 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
14ff0 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
15000 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
15010 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
15020 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
15030 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
15040 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
15050 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
15060 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
15070 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
15080 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
15090 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
150a0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
150b0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
150c0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
150d0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
150e0 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
150f0 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
15100 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
15110 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
15120 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
15130 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
15140 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
15150 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
15160 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
15170 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
15180 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
15190 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
151a0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
151b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
151c0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
151d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
151e0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
151f0 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
15200 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
15210 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
15220 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15230 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
15240 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
15250 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
15260 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
15270 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
15280 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
15290 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
152a0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
152b0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
152c0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
152d0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
152e0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
152f0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
15300 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
15310 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
15320 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
15330 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
15340 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
15350 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
15360 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
15370 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
15380 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
15390 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
153a0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
153b0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
153c0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
153d0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
153e0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
153f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
15400 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
15410 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
15420 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15430 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
15440 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
15450 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
15460 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
15470 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
15480 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
15490 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
154a0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
154b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
154c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
154d0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
154e0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
154f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
15500 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15510 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
15520 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
15530 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
15540 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
15550 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
15560 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
15570 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
15580 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
15590 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
155a0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
155b0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
155c0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
155d0 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
155e0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
155f0 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
15600 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
15610 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
15620 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
15630 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
15640 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
15650 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
15660 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
15670 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
15680 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
15690 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
156a0 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
156b0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
156c0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
156d0 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
156e0 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
156f0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
15700 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
15710 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
15720 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
15730 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
15750 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
15760 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c    assert(MEMDB||
15770 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15780 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
15790 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  mpFile);.  if( p
157a0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
157b0 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ods ){.    IOTRA
157c0 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
157d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
157e0 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
157f0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15800 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
15810 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15820 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15830 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
15840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15850 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15860 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15870 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
15880 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
15890 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
158a0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
158b0 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
158c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
158d0 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
158e0 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
158f0 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
15900 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
15910 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
15920 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
15930 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
15940 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
15950 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
15960 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
15970 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
15980 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
15990 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
159a0 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
159b0 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
159c0 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
159d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
159e0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
159f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
15a00 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   n = 0;.  int rc
15a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15a20 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
15a30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
15a40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
15a50 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
15a60 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
15a70 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
15a80 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
15a90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
15aa0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15ab0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
15ac0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
15ad0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15ae0 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
15af0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15b00 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
15b10 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
15b20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15b30 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
15b40 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15b50 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
15b60 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
15b70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
15b80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
15b90 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
15ba0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
15bb0 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
15bc0 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
15bd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
15be0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
15bf0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
15c00 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
15c10 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
15c20 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
15c30 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
15c40 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
15c50 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
15c60 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
15c70 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
15c80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
15c90 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20  xPgno = n;.  }. 
15ca0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
15cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15cc0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
15cd0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
15ce0 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
15cf0 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
15d00 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
15d10 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
15d20 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
15d30 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  Orig);.  sqlite3
15d40 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
15d50 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
15d60 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
15d70 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23  ->pStmt = 0;.}.#
15d80 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65  else.#define cle
15d90 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e  arHistory(x).#en
15da0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
15db0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
15dc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
15dd0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
15de0 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  ;../*.** Unlink 
15df0 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73  pPg from its has
15e00 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
15e10 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
15e20 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
15e30 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
15e40 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
15e50 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
15e60 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
15e70 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
15e80 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
15e90 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
15ea0 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
15eb0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
15ec0 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
15ed0 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
15ee0 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
15ef0 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
15f00 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
15f10 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
15f20 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
15f30 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
15f40 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
15f50 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
15f60 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
15f70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
15f80 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
15f90 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
15fa0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
15fb0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
15fc0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
15fd0 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
15fe0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
15ff0 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
16000 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
16010 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
16020 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
16030 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
16040 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
16050 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
16060 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
16070 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
16080 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
16090 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
160a0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
160b0 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
160c0 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
160d0 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
160e0 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
160f0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
16100 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
16110 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
16120 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
16130 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
16140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
16150 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
16160 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
16170 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
16180 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
16190 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
161a0 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
161b0 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
161c0 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
161d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
161e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
161f0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
16200 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66  /* Unlink from f
16210 72 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  ree page list */
16220 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65  .  lruListRemove
16230 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  (pPg);..  /* Unl
16240 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
16250 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
16260 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
16270 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
16280 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16290 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
162a0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
162b0 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62  che when a datab
162c0 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61  ase.** is trunca
162d0 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20  ted.  Drop from 
162e0 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61  the cache all pa
162f0 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
16300 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e  s.** larger than
16310 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16320 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
16330 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ced..**.** Refer
16340 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
16350 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
16360 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
16370 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c  d..**.** Actuall
16380 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  y, at the point 
16390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
163a0 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64  called, it would
163b0 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   be.** an error 
163c0 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65  to have a refere
163d0 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20  nced page.  But 
163e0 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65  rather than dele
163f0 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  te.** that page 
16400 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20  and guarantee a 
16410 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61  subsequent segfa
16420 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65  ult, it seems be
16430 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20  tter.** to zero 
16440 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74  it and hope that
16450 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61   we error out sa
16460 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nely..*/.static 
16470 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
16480 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
16490 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
164a0 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
164b0 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
164c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
164d0 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
164e0 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
164f0 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
16500 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
16510 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
16520 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
16530 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
16540 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
16550 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
16560 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16570 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
16580 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
16590 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
165a0 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
165b0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
165c0 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
165d0 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
165e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
165f0 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
16600 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
16610 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
16620 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
16630 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
16640 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  t);.      unlink
16650 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
16660 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
16670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
16680 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
16690 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
166a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
166b0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
166c0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
166d0 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
166e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
166f0 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
16700 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
16710 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
16720 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
16730 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
16740 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
16750 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
16760 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
16770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
16780 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
16790 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
167a0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
167b0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
167c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
167d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
167e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
167f0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
16800 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
16810 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
16820 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
16830 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
16840 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
16850 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
16860 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
16870 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
16880 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
16890 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
168a0 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
168b0 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
168c0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
168d0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
168e0 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
168f0 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
16900 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
16910 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
16920 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
16930 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
16940 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d  r->dbSize<0 || M
16950 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70  EMDB );..  if( p
16960 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
16970 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
16980 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16990 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
169a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
169b0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
169c0 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
169d0 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
169e0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
169f0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
16a00 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
16a10 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
16a20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16a40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
16a50 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
16a60 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
16a70 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
16a80 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
16a90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
16aa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
16ab0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
16ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16ad0 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
16ae0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
16af0 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65  gerTruncate(Page
16b00 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
16b10 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
16b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16b30 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
16b40 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
16b50 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
16b60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
16b70 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
16b80 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
16b90 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
16ba0 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
16bb0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
16bc0 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
16bd0 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
16be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16c00 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16c10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16c20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
16c30 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
16c40 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
16c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16c60 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65  .  }.  pagerEnte
16c70 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
16c80 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
16c90 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
16ca0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ave(pPager);.  i
16cb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16cc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16cd0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
16ce0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
16cf0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16d00 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
16d10 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72  ting. */.  pager
16d20 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
16d30 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16d40 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16d50 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
16d60 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
16d70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
16d80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16d90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16da0 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
16db0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
16dc0 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72   nPage);.  retur
16dd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
16de0 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
16df0 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
16e00 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
16e10 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
16e20 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
16e30 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
16e40 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
16e50 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16e60 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
16e70 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
16e80 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
16e90 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
16ea0 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
16eb0 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
16ec0 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
16ed0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
16ee0 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
16ef0 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
16f00 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
16f10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
16f20 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
16f30 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
16f40 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
16f50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
16f60 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
16f70 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
16f80 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
16f90 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
16fa0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
16fb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16fc0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
16fd0 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
16fe0 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
16ff0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
17000 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
17010 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
17020 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
17030 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
17040 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
17050 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
17060 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17070 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
17080 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  NT.  if( !MEMDB 
17090 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
170a0 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
170b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
170c0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
170d0 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20  TATIC_MEM2);.   
170e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
170f0 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
17100 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72   if( pPager->pPr
17110 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ev ){.      pPag
17120 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  er->pPrev->pNext
17130 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
17140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17150 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
17160 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ist = pPager->pN
17170 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
17180 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  f( pPager->pNext
17190 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
171a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
171b0 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a   pPager->pPrev;.
171c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
171d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
171e0 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
171f0 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
17200 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17210 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
17220 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
17230 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
17240 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
17250 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
17260 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
17270 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
17280 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
17290 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
172a0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
172b0 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
172c0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
172d0 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
172e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
172f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17300 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
17310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17320 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
17330 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
17340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
17350 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
17360 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
17370 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
17380 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
17390 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
173a0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
173b0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
173c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
173d0 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
173e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
173f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
17400 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
17410 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
17420 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
17430 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
17440 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
17450 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
17460 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
17470 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
17480 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73    ** }.  */..  s
17490 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
174a0 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
174b0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
174c0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
174d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
174e0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
174f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
17500 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
17510 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
17520 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
17530 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
17540 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
17550 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
17560 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
17570 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
17580 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
17590 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
175a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
175b0 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e  e page_ref() fun
175c0 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
175d0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
175e0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
175f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
17600 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
17610 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
17620 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
17630 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
17640 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
17650 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
17660 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65  **.** For non-te
17670 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
17680 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72  _ref() is a macr
17690 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61  o that calls _pa
176a0 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69  ge_ref().** onli
176b0 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ne of the refere
176c0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
176d0 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73  o.  For test sys
176e0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
176f0 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75  .** is a real fu
17700 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77  nction so that w
17710 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70  e can set breakp
17720 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20  oints and trace 
17730 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
17740 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
17750 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
17760 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
17770 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
17780 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
17790 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
177a0 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
177b0 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
177c0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  Pg);.    pPg->pP
177d0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
177e0 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
177f0 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
17800 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
17810 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
17820 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
17830 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
17840 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
17850 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
17860 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
17870 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
17880 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
17890 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
178a0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
178b0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
178c0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
178d0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
178e0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
178f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17900 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
17910 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
17920 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
17930 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
17940 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17950 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
17960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17970 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
17980 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
17990 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
179a0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
179b0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
179c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
179d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
179e0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
179f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
17a00 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
17a10 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
17a20 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
17a30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
17a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
17a50 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
17a60 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
17a70 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
17a80 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
17a90 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
17aa0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
17ab0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
17ac0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
17ad0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
17ae0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
17af0 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
17b00 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
17b10 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
17b20 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
17b30 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
17b40 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
17b50 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
17b60 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
17b70 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
17b80 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
17b90 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
17ba0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
17bb0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
17bc0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
17bd0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
17be0 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
17bf0 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
17c00 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
17c10 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
17c20 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
17c30 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
17c40 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
17c50 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
17c60 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
17c70 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
17c80 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
17c90 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
17ca0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
17cb0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
17cc0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
17cd0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17ce0 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
17cf0 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
17d00 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
17d10 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
17d20 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
17d30 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
17d40 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
17d50 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
17d60 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
17d70 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
17d80 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
17d90 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
17da0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
17db0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
17dc0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
17dd0 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
17de0 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
17df0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
17e00 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
17e10 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
17e20 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
17e30 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
17e40 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
17e50 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
17e60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
17e70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17e80 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
17e90 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
17ea0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
17eb0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
17ec0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
17ed0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
17ee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17ef0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
17f00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17f10 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
17f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
17f30 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
17f40 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
17f50 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
17f60 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
17f70 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
17f80 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
17f90 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
17fa0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
17fb0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
17fc0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
17fd0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
17fe0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
17ff0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
18000 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
18010 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
18020 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
18030 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
18040 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
18050 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
18060 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
18070 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
18080 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
18090 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
180a0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
180b0 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
180c0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
180d0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
180e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
180f0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
18100 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
18110 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
18120 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18130 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
18140 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
18150 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
18160 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18170 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
18180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18190 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
181a0 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
181b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
181c0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
181d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
181e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
181f0 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
18200 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
18210 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18220 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
18230 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
18240 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
18250 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
18260 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
18270 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
18280 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
18290 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
182a0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
182b0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
182c0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
182d0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
182e0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
182f0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
18300 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
18310 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
18320 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
18330 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
18340 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
18350 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
18360 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
18370 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
18380 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
18390 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
183a0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
183b0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
183c0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
183d0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
183e0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
183f0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
18400 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
18410 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
18420 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
18430 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
18440 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
18450 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
18460 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
18470 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
18480 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
18490 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
184a0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
184b0 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
184c0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
184d0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
184e0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
184f0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
18500 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18510 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18520 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18530 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18540 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
18550 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
18560 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
18570 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
18580 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
18590 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
185a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
185b0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
185c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
185d0 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
185e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
185f0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
18600 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
18610 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
18620 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
18630 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
18640 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
18650 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
18660 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
18670 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
18680 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
18690 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
186a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
186b0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
186c0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
186d0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
186e0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
186f0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
18700 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18710 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
18720 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
18730 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18750 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
18760 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
18770 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
18780 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
18790 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
187a0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
187b0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
187c0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
187d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
187e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
187f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18800 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
18810 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
18820 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18830 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
18840 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
18850 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
18860 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
18870 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18880 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
18890 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
188a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
188b0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
188c0 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69      lruListSetFi
188d0 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
188e0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
188f0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
18900 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
18910 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
18920 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
18930 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
18940 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
18950 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
18960 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
18970 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
18980 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
18990 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
189a0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
189b0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
189c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
189d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
189e0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
189f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18a00 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
18a10 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
18a20 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
18a30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18a40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18a50 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
18a60 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
18a70 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
18a80 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
18a90 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
18aa0 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
18ab0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
18ac0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
18ad0 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
18ae0 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
18af0 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
18b00 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
18b10 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
18b20 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
18b30 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
18b40 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
18b50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
18b60 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
18b70 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
18b80 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
18b90 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
18ba0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
18bb0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18bc0 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
18bd0 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
18be0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
18bf0 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
18c00 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18c10 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
18c20 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
18c30 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
18c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
18c50 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
18c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
18c70 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
18c80 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
18c90 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
18ca0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
18cb0 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
18cc0 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
18cd0 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
18ce0 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
18cf0 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
18d00 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
18d10 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
18d20 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
18d30 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
18d40 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18d50 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
18d60 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18d70 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
18d80 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18d90 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
18da0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
18db0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
18dc0 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
18dd0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
18de0 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
18df0 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18e00 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
18e10 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
18e20 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
18e30 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
18e40 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
18e50 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
18e60 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
18e70 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
18e80 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
18e90 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
18ea0 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
18eb0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
18ec0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
18ed0 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
18ee0 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
18ef0 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
18f00 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
18f10 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
18f20 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
18f30 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
18f40 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
18f50 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
18f60 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
18f70 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
18f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
18f90 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
18fa0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
18fb0 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
18fc0 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
18fd0 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
18fe0 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
18ff0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
19000 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
19010 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
19020 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
19030 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
19040 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
19050 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
19060 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
19070 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
19080 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
19090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
190a0 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
190b0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
190c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
190d0 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
190e0 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
190f0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
19100 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
19110 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
19120 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
19130 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
19140 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
19150 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
19160 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
19170 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
19180 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
19190 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
191a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
191b0 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
191c0 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
191d0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
191e0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
191f0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
19200 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67  er *pPager;.  Pg
19210 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  Hdr *p;.  int rc
19220 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
19230 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19240 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
19250 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
19260 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
19270 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
19280 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
19290 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
192a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
192b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
192c0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
192d0 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
192e0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
192f0 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
19300 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
19310 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
19320 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
19330 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
19340 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
19350 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
19360 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
19370 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
19380 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
19390 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
193a0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
193b0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
193c0 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
193d0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
193e0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
193f0 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
19400 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
19410 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
19420 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
19430 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
19440 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
19450 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
19460 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
19470 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
19480 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
19490 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
194a0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
194b0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
194c0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
194d0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
194e0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
194f0 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
19500 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
19510 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
19520 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
19530 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
19540 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
19550 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
19560 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
19570 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
19580 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
19590 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
195a0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
195b0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
195c0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
195d0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
195e0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
195f0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
19600 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
19610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19630 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
19640 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
19650 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
19660 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
19670 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
19680 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d  >dirty );.    p-
19690 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
196a0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
196b0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
196c0 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
196d0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
196e0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
196f0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19700 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
19710 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
19720 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
19730 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19740 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
19750 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
19760 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
19770 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
197a0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
197b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
197c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
197d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
197e0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
197f0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
19800 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
19810 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
19820 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
19830 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
19840 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
19850 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
19860 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
19870 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
19880 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
19890 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
198a0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
198b0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
198c0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
198d0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
198e0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
198f0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
19900 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
19910 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
19920 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
19930 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19940 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
19950 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
19960 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
19970 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
19980 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
19990 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
199a0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
199b0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
199d0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
199e0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
199f0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19a00 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
19a10 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
19a20 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
19a30 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
19a40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19a50 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
19a60 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
19a70 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
19a80 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
19a90 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
19aa0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
19ab0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
19ac0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
19ad0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
19ae0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
19af0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
19b00 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
19b10 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
19b20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19b30 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19b40 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
19b50 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
19b60 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
19b70 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
19b80 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
19b90 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19ba0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
19bb0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
19bc0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19bd0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19be0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19bf0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
19c00 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
19c10 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
19c20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
19c30 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
19c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19c50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
19c60 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
19c70 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
19c80 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
19c90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19ca0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
19cb0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
19cc0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
19cd0 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
19ce0 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
19cf0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
19d00 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
19d10 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
19d20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19d30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19d40 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
19d50 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19d60 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
19d70 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
19d80 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
19d90 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
19da0 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
19db0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
19dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
19dd0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
19de0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19df0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
19e00 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
19e10 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
19e20 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
19e30 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
19e40 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
19e50 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
19e60 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
19e70 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
19e80 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
19e90 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
19ea0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19eb0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19ec0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19ed0 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
19ee0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
19ef0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19f00 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
19f10 74 68 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30  thods ) return 0
19f20 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
19f30 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
19f40 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
19f50 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
19f60 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 72 65  XISTS) ){.    re
19f70 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
19f80 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
19f90 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
19fa0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
19fb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19fc0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
19fd0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
19fe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
19ff0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
1a000 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1a010 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  al, 0);.    retu
1a020 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
1a030 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1a040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1a050 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
1a060 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
1a070 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
1a080 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a090 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
1a0a0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
1a0b0 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
1a0c0 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
1a0d0 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
1a0e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
1a0f0 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1a100 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
1a110 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
1a120 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
1a130 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a140 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
1a150 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
1a160 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  l to call this f
1a170 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
1a180 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a  he pager object.
1a190 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
1a1a0 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61 74  by pPager has at
1a1b0 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20   least one free 
1a1c0 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68 20  page (page with 
1a1d0 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a  nRef==0)..  */ .
1a1e0 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
1a1f0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
1a200 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1a210 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
1a220 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
1a230 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
1a240 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
1a250 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
1a260 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
1a270 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
1a280 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
1a290 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a2a0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
1a2b0 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
1a2c0 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
1a2d0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1a2e0 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
1a2f0 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
1a300 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
1a310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a320 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
1a330 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
1a340 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
1a350 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
1a360 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
1a370 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
1a380 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
1a390 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
1a3a0 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  & pPager->lru.pF
1a3b0 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  irst){.    int i
1a3c0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1a3d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a3e0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1a3f0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
1a400 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1a410 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1a420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a430 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1a440 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1a450 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1a460 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1a470 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1a480 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
1a490 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
1a4a0 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
1a4b0 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
1a4c0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1a4d0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
1a4e0 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
1a4f0 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
1a500 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
1a510 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
1a520 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
1a530 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
1a540 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
1a550 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
1a560 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
1a570 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
1a580 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
1a590 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
1a5a0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
1a5b0 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
1a5c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
1a5d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1a5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a5f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a600 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
1a610 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1a620 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1a630 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1a640 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a660 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1a670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a680 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
1a690 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1a6a0 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  rst;.  }..  asse
1a6b0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
1a6c0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1a6d0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
1a6e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
1a6f0 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
1a700 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
1a710 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
1a720 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1a730 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1a740 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
1a750 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
1a760 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1a770 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1a780 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1a790 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
1a7a0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
1a7b0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1a7c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a7d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a7e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1a7f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1a800 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
1a810 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
1a820 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
1a830 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
1a840 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
1a850 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
1a860 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
1a870 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
1a880 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
1a890 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1a8a0 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
1a8b0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
1a8c0 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
1a8d0 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
1a8e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1a8f0 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
1a900 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
1a910 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
1a920 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
1a930 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
1a940 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
1a950 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
1a960 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
1a970 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
1a980 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
1a990 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
1a9a0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
1a9b0 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
1a9c0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1a9d0 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
1a9e0 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
1a9f0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1aa00 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
1aa10 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
1aa20 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
1aa30 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
1aa40 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1aa50 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
1aa60 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
1aa70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
1aa80 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
1aa90 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
1aaa0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
1aab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1aac0 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
1aad0 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
1aae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1aaf0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1ab00 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1ab10 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  ANAGEMENT./*.** 
1ab20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ab30 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
1ab40 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
1ab50 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
1ab60 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
1ab70 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
1ab80 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
1ab90 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
1aba0 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
1abb0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
1abc0 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
1abd0 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  e sqlite3_free()
1abe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
1abf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ac00 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
1ac10 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
1ac20 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
1ac30 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
1ac40 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1ac50 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20  rns. The return 
1ac60 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
1ac70 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
1ac80 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1ac90 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e   released..*/.in
1aca0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1acb0 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
1acc0 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nReq){.  int nRe
1acd0 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20  leased = 0;     
1ace0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1acf0 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1ad00 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c   so far */.  sql
1ad10 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1ad20 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
1ad30 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
1ad40 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ad60 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1ad70 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79  pagers */.  Busy
1ad80 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75  Handler *savedBu
1ad90 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64  sy;     /* Saved
1ada0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73   copy of the bus
1adb0 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  y handler */.  i
1adc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1add0 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65  K;..  /* Acquire
1ade0 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61   the memory-mana
1adf0 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a  gement mutex.  *
1ae00 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69  /.  mutex = sqli
1ae10 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1ae20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1ae30 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c  TIC_MEM2);.  sql
1ae40 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ae50 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  (mutex);..  /* S
1ae60 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62 61  ignal all databa
1ae70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1ae80 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67  hat memory manag
1ae90 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a  ement wants.  **
1aea0 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 20   to have access 
1aeb0 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a 20  to the pagers.. 
1aec0 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72   */.  for(pPager
1aed0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  =sqlite3PagerLis
1aee0 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65  t; pPager; pPage
1aef0 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
1af00 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  {.     pPager->i
1af10 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d  InUseMM = 1;.  }
1af20 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1af30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65  QLITE_OK && (nRe
1af40 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
1af50 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50 67  <nReq) ){.    Pg
1af60 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50 67  Hdr *pPg;.    Pg
1af70 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a  Hdr *pRecycled;.
1af80 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20   .    /* Try to 
1af90 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  find a page to r
1afa0 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65 73  ecycle that does
1afb0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 73   not require a s
1afc0 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ync(). If.    **
1afd0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   this is not pos
1afe0 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20  sible, find one 
1aff0 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69 72  that does requir
1b000 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20 20  e a sync()..    
1b010 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  */.    sqlite3_m
1b020 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1b030 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1b040 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1b050 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50  IC_LRU));.    pP
1b060 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
1b070 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
1b080 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ced;.    while( 
1b090 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65  pPg && (pPg->nee
1b0a0 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50  dSync || pPg->pP
1b0b0 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20  ager->iInUseDB) 
1b0c0 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  ){.      pPg = p
1b0d0 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1b0e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1b0f0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67  pPg ){.      pPg
1b100 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1b110 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20  eList.pFirst;.  
1b120 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1b130 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69  & pPg->pPager->i
1b140 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20  InUseDB ){.     
1b150 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1b160 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ree.pNext;.     
1b170 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1b180 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b190 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
1b1a0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b1b0 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1b1c0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d  .    /* If pPg==
1b1d0 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63  0, then the bloc
1b1e0 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c  k above has fail
1b1f0 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ed to find a pag
1b200 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79  e to.    ** recy
1b210 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  cle. In this cas
1b220 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d  e return early -
1b230 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f   no further memo
1b240 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ry will.    ** b
1b250 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
1b260 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 20  */.    if( !pPg 
1b270 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50  ) break;..    pP
1b280 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1b290 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21  er;.    assert(!
1b2a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1b2b0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1b2c0 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61  u.pFirst);.    a
1b2d0 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53  ssert(pPg->needS
1b2e0 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1b2f0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1b300 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61  nced);.  .    sa
1b310 76 65 64 42 75 73 79 20 3d 20 70 50 61 67 65 72  vedBusy = pPager
1b320 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->pBusyHandler;.
1b330 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1b340 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20  yHandler = 0;.  
1b350 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1b360 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52  ycle(pPager, &pR
1b370 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50  ecycled);.    pP
1b380 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1b390 65 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a  er = savedBusy;.
1b3a0 20 20 20 20 61 73 73 65 72 74 28 70 52 65 63 79      assert(pRecy
1b3b0 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21  cled==pPg || rc!
1b3c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20  =SQLITE_OK);.   
1b3d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b3e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  OK ){.      /* W
1b3f0 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67  e've found a pag
1b400 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68  e to free. At th
1b410 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67  is point the pag
1b420 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20  e has been .    
1b430 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f    ** removed fro
1b440 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d  m the page hash-
1b450 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74  table, free-list
1b460 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74   and synced-list
1b470 20 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72   .      ** (pFir
1b480 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73  stSynced). It is
1b490 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c   still in the al
1b4a0 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c  l pages (pAll) l
1b4b0 69 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52  ist. .      ** R
1b4c0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
1b4d0 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66  is list before f
1b4e0 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a  reeing..      **
1b4f0 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20  .      ** Todo: 
1b500 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
1b510 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
1b520 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
1b530 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a  Ok. It .      **
1b540 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f   probably is tho
1b550 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
1b560 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b      PgHdr *pTmp;
1b570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b580 50 67 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg );.      if( 
1b590 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pPg==pPager->pAl
1b5a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50  l ){.         pP
1b5b0 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
1b5c0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
1b5d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b5e0 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65   for( pTmp=pPage
1b5f0 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70  r->pAll; pTmp->p
1b600 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54  NextAll!=pPg; pT
1b610 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  mp=pTmp->pNextAl
1b620 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 54  l ){}.        pT
1b630 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  mp->pNextAll = p
1b640 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
1b650 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c      }.      nRel
1b660 65 61 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20  eased += (.     
1b670 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67       sizeof(*pPg
1b680 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
1b690 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 2b  Size.          +
1b6a0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1b6b0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1b6c0 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1b6d0 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1b6e0 29 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ) .      );.    
1b6f0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
1b700 45 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70  EE %p %d *\n", p
1b710 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1b720 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
1b730 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1b740 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
1b750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1b760 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1b770 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
1b780 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b790 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
1b7a0 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
1b7b0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
1b7c0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
1b7d0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1b7e0 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
1b7f0 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
1b800 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
1b810 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
1b820 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
1b830 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
1b840 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
1b850 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
1b860 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72  .      ** The er
1b870 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
1b880 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
1b890 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
1b8a0 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 2a  he case .      *
1b8b0 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
1b8c0 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
1b8d0 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
1b8e0 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
1b8f0 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
1b900 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
1b910 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29 3d        (rc&0xff)=
1b920 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
1b930 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
1b940 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
1b950 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1b960 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29 3b  TE_BUSY.      );
1b970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b980 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1b990 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1b9a0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
1b9b0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1b9c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1b9d0 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20  lear the memory 
1b9e0 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73  management flags
1b9f0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1ba00 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f   mutex.  */.  fo
1ba10 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33  r(pPager=sqlite3
1ba20 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65  PagerList; pPage
1ba30 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72  r; pPager=pPager
1ba40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70  ->pNext){.     p
1ba50 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
1ba60 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1ba70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
1ba80 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  utex);..  /* Ret
1ba90 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1baa0 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65 64  f bytes released
1bab0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  .  */.  return n
1bac0 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
1bad0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1bae0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1baf0 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
1bb00 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1bb10 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74   of page pPg out
1bb20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1bb30 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1bb40 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1bb50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1bb60 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20  gHdr *pPg, Pgno 
1bb70 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pgno){.  int rc;
1bb80 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20  .  i64 offset;. 
1bb90 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
1bba0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  0 );.  assert(pP
1bbb0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bbc0 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
1bbd0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50  File);.  if( !pP
1bbe0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bbf0 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ds ){.    return
1bc00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1bc10 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  ORT_READ;.  }.  
1bc20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1bc30 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1bc40 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
1bc50 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1bc60 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
1bc70 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1bc80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1bc90 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
1bca0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1bcb0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1bcc0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1bcd0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1bce0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1bcf0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1bd00 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
1bd10 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1bd20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1bd30 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
1bd40 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  8*)PGHDR_TO_DATA
1bd50 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20  (pPg))[24],.    
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1bd90 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1bda0 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44  ers));.  }.  COD
1bdb0 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC1(pPager, PGHD
1bdc0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1bdd0 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
1bde0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45   PAGERTRACE4("FE
1bdf0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1be00 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1be20 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1be30 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
1be40 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
1be50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1be60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1be70 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1be80 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
1be90 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
1bea0 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
1beb0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
1bec0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1bed0 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
1bee0 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
1bef0 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
1bf00 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1bf10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1bf20 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
1bf30 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
1bf40 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
1bf50 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
1bf60 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
1bf70 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
1bf80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
1bf90 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
1bfa0 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
1bfb0 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
1bfc0 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
1bfd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bfe0 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1bff0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c000 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c010 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f  E_OK;.  int isHo
1c020 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
1c030 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
1c040 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c   opened for excl
1c050 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68 61  usive access, ha
1c060 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1c070 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65   .  ** page refe
1c080 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e  rences and is in
1c090 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   an error-state,
1c0a0 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61 6e   now is the chan
1c0b0 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
1c0c0 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
1c0d0 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
1c0e0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
1c0f0 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e  che and treat an
1c100 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72  y.  ** open jour
1c110 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f  nal file as a ho
1c120 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t-journal..  */.
1c130 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1c140 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1c150 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
1c160 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 50 61 67  >nRef==0 && pPag
1c170 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1c180 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1c190 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1c1a0 20 20 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20      isHot = 1;. 
1c1b0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 72     }.    pager_r
1c1c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c1d0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1c1e0 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
1c1f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1c200 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
1c210 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
1c220 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
1c230 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
1c240 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
1c250 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
1c260 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1c270 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
1c280 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
1c290 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
1c2a0 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
1c2b0 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
1c2c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1c2d0 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
1c2e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
1c2f0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
1c300 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1c310 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
1c320 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1c330 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1c340 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  || isHot ){.    
1c350 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c360 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c370 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1c380 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c390 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
1c3a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
1c3b0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1c3c0 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
1c3d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1c3e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
1c3f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
1c400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c420 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1c430 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1c440 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c450 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c460 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1c470 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
1c480 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
1c490 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
1c4a0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
1c4b0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
1c4c0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
1c4d0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c4e0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
1c4f0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
1c500 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
1c510 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
1c520 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
1c530 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
1c540 29 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20  ) || isHot ){.  
1c550 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1c560 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1c570 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c580 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1c590 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1c5a0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1c5b0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1c5c0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1c5d0 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1c5e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1c5f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1c600 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1c610 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1c620 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1c630 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c640 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1c650 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1c660 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1c670 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1c680 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1c690 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1c6a0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1c6b0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1c6c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1c6d0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1c6e0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1c6f0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1c700 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1c710 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1c720 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1c730 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1c740 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1c750 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1c760 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1c770 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1c780 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
1c790 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1c7a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1c7b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c7c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c7d0 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
1c7e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c7f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1c800 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1c810 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1c820 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1c830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c840 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1c850 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1c860 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c870 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1c880 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1c890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c8a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c8b0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1c8c0 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20  E;.        }. . 
1c8d0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
1c8e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1c8f0 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
1c900 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1c910 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   if.        ** w
1c920 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1c930 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1c940 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20   file. .        
1c950 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1c960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1c970 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1c980 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
1c990 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
1c9a0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
1c9b0 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
1c9c0 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
1c9d0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
1c9e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  .        ** a wr
1c9f0 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
1ca00 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
1ca10 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
1ca20 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   more.        **
1ca30 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
1ca40 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
1ca50 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1ca60 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1ca70 20 20 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20      ** Open the 
1ca80 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
1ca90 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
1caa0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
1cab0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  n .        ** ex
1cac0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1cad0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
1cae0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1caf0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
1cb00 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
1cb10 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
1cb20 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
1cb30 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
1cb40 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ms, the.        
1cb50 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
1cb60 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
1cb70 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1cb80 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
1cb90 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65  .        ** a re
1cba0 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
1cbb0 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndle..        */
1cbc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
1cbd0 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Hot ){.         
1cbe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1cbf0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  Y;.          if(
1cc00 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1cc10 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1cc20 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1cc30 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
1cc40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1cc50 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
1cc60 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
1cc70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1cc80 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
1cc90 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1ccb0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1ccc0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
1ccd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cce0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1ccf0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1cd00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
1cd10 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
1cd20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1cd30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1cd40 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
1cd50 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ds );.          
1cd60 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54    if( fout&SQLIT
1cd70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1cd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1cd90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1cda0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y;.             
1cdb0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1cdc0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1cdd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cdf0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1ce00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ce10 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
1ce20 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1ce30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ce40 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ((rc==SQLITE_NOM
1ce50 45 4d 7c 7c 72 63 3d 3d 53 51 4c 49 54 45 5f 49  EM||rc==SQLITE_I
1ce60 4f 45 52 52 5f 4e 4f 4d 45 4d 29 3f 72 63 3a 53  OERR_NOMEM)?rc:S
1ce70 51 4c 49 54 45 5f 42 55 53 59 29 3b 0a 20 20 20  QLITE_BUSY);.   
1ce80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1ce90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1cea0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1ceb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1cec0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
1ced0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1cee0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
1cef0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
1cf00 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
1cf10 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cf20 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20  alHdr = 0;. .   
1cf30 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
1cf40 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
1cf50 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
1cf60 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
1cf70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  e.        ** loc
1cf80 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
1cf90 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
1cfa0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1cfb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1cfc0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
1cfd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cfe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cff0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d000 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1d010 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1d020 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1d030 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  t(pPager->state=
1d040 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1d050 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
1d060 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1d070 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
1d080 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
1d090 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ED).        );. 
1d0a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1d0b0 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
1d0c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1d0d0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
1d0e0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
1d0f0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
1d100 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20  ase file.       
1d110 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
1d120 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
1d130 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
1d140 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
1d150 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
1d160 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1d170 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
1d180 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
1d190 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  se.        ** ha
1d1a0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
1d1b0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1d1c0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
1d1d0 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20  lush the.       
1d1e0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
1d1f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1d200 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
1d210 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
1d220 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
1d230 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
1d240 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66         ** at off
1d250 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
1d260 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
1d270 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
1d280 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  ytes are.       
1d290 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
1d2a0 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
1d2b0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
1d2c0 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
1d2d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
1d2e0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
1d2f0 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
1d300 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
1d310 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  n.        ** a c
1d320 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
1d330 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
1d340 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
1d350 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
1d360 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
1d370 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
1d380 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  t be .        **
1d390 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
1d3a0 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
1d3b0 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
1d3c0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
1d3d0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
1d3e0 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
1d3f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d400 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
1d410 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
1d420 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
1d430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1d440 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1d450 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
1d460 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d470 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
1d480 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1d490 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
1d4a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
1d4b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
1d4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f   ){.          IO
1d4d0 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
1d4e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1d4f0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1d500 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  rs)));.         
1d510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1d520 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1d530 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
1d540 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
1d550 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   24);.          
1d560 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d570 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d5b0 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
1d5c0 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
1d5d0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1d5e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
1d5f0 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
1d600 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d610 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d620 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
1d630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
1d640 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d650 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d660 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1d670 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1d680 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
1d690 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
1d6a0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1d6b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1d6c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1d6d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
1d6e0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1d6f0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
1d700 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1d720 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65  ate a PgHdr obje
1d730 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65  ct.   Either cre
1d740 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72  ate a new one or
1d750 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69   reuse.** an exi
1d760 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69  sting one that i
1d770 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
1d780 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  in use..**.** A 
1d790 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74  new PgHdr struct
1d7a0 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69  ure is created i
1d7b0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
1d7c0 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72  lowing are.** tr
1d7d0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ue:.**.**     (1
1d7e0 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65  )  We have not e
1d7f0 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69  xceeded our maxi
1d800 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  mum allocated ca
1d810 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1d820 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74       as set by t
1d830 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  he "PRAGMA cache
1d840 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  _size" command..
1d850 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
1d860 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73  here are no unus
1d870 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ed PgHdr objects
1d880 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68   available at th
1d890 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  is time..**.**  
1d8a0 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20     (3)  This is 
1d8b0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1d8c0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
1d8d0 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20   (4)  There are 
1d8e0 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  no PgHdr objects
1d8f0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
1d900 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  uire a journal.*
1d910 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  *          file 
1d920 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20  sync and a sync 
1d930 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1d940 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
1d950 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f  .**          pro
1d960 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  hibited..**.** O
1d970 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20  therwise, reuse 
1d980 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64  an existing PgHd
1d990 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
1d9a0 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20  ds, reuse an.** 
1d9b0 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69  existing PgHdr i
1d9c0 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1d9d0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1d9e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
1d9f0 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20  We have reached 
1da00 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20  or exceeded the 
1da10 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69  maximum cache si
1da20 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
1da30 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d  llowed by "PRAGM
1da40 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a  A cache_size"..*
1da50 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
1da60 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61  ere is a PgHdr a
1da70 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67  vailable with Pg
1da80 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a  Hdr->nRef==0.**.
1da90 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61  **     (3)  We a
1daa0 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d  re not in an in-
1dab0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
1dac0 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45  **.**     (4)  E
1dad0 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61  ither there is a
1dae0 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64  n available PgHd
1daf0 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  r that does not 
1db00 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  need.**         
1db10 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f   to be synced to
1db20 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69   disk or else di
1db30 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75  sk syncing is cu
1db40 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
1db50 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a      allowed..*/.
1db60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1db70 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67  AllocatePage(Pag
1db80 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
1db90 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74  r **ppPg){.  int
1dba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dbb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1dbc0 20 69 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a   int nByteHdr;..
1dbd0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
1dbe0 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f  w PgHdr if any o
1dbf0 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69  f the four condi
1dc00 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20  tions defined . 
1dc10 20 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65   ** above are me
1dc20 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  t: */.  if( pPag
1dc30 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
1dc40 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70  ->mxPage.   || p
1dc50 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1dc60 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44  t==0 .   || MEMD
1dc70 42 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  B.   || (pPager-
1dc80 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1dc90 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
1dca0 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a  doNotSync).  ){.
1dcb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1dcc0 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
1dcd0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61  Hash ){.      pa
1dce0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
1dcf0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
1dd00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1dd10 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
1dd20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
1dd30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1dd40 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
1dd50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1dd60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1dd70 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1dd80 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1dd90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1dda0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1ddb0 29 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20  );.    nByteHdr 
1ddc0 3d 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  = sizeof(*pPg) +
1ddd0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1dde0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
1de00 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
1de10 74 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d  tory);.    pPg =
1de20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1de30 20 6e 42 79 74 65 48 64 72 20 2b 20 70 50 61 67   nByteHdr + pPag
1de40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1de50 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70      pagerEnter(p
1de60 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1de70 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
1de80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1de90 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  M;.      goto pa
1dea0 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1deb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
1dec0 65 74 28 70 50 67 2c 20 30 2c 20 6e 42 79 74 65  et(pPg, 0, nByte
1ded0 48 64 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Hdr);.    pPg->p
1dee0 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 28 6e  Data = (void*)(n
1def0 42 79 74 65 48 64 72 20 2b 20 28 63 68 61 72 2a  ByteHdr + (char*
1df00 29 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  )pPg);.    pPg->
1df10 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
1df20 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
1df30 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
1df40 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
1df50 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
1df60 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
1df70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1df80 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
1df90 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
1dfa0 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
1dfb0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1dfc0 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1dfd0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1dfe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1dff0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
1e010 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KED;.    }.    i
1e020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e030 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1e040 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1e050 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
1e060 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e070 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1e080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
1e090 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
1e0a0 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
1e0b0 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
1e0c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e0d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1e0e0 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ave the content 
1e0f0 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
1e100 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
1e110 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
1e120 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
1e130 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  nt==1, then the 
1e140 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a  content was.** j
1e150 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ust initialized 
1e160 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64  to zeros instead
1e170 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
1e180 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74  rom disk..** But
1e190 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65   now we need the
1e1a0 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f   real data off o
1e1b0 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65  f disk.  So make
1e1c0 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65   sure we.** have
1e1d0 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e   it.  Read it in
1e1e0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   if we do not ha
1e1f0 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a  ve it already..*
1e200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e210 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50  er_get_content(P
1e220 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
1e230 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20  ( pPg->needRead 
1e240 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
1e250 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
1e260 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
1e270 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
1e280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e290 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
1e2a0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1e2b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1e2c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1e2d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e2e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1e2f0 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
1e300 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
1e310 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
1e320 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
1e330 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
1e340 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
1e350 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
1e360 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
1e370 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1e380 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
1e390 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e3a0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
1e3b0 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
1e3c0 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
1e3d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1e3e0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
1e3f0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1e400 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
1e410 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
1e420 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
1e430 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
1e440 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
1e450 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
1e460 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
1e470 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
1e480 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
1e490 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
1e4a0 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
1e4b0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
1e4c0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
1e4d0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
1e4e0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
1e4f0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
1e500 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
1e510 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
1e520 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
1e530 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1e540 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1e550 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1e560 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
1e570 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1e580 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
1e590 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1e5a0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
1e5b0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
1e5c0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
1e5d0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
1e5e0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
1e5f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1e600 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
1e610 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
1e620 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
1e630 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
1e640 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
1e650 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
1e660 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
1e670 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
1e680 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
1e690 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
1e6a0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
1e6b0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
1e6c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
1e6d0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
1e6e0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
1e6f0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
1e700 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
1e710 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
1e720 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
1e730 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  es..**.** If noC
1e740 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  ontent is false,
1e750 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1e760 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
1e770 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1e780 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1e790 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
1e7a0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
1e7b0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1e7c0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
1e7d0 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
1e7e0 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  time, so do not 
1e7f0 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20  do a disk read. 
1e800 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
1e810 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e  e.** page conten
1e820 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42  t with zeros.  B
1e830 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74  ut mark the fact
1e840 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
1e850 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f  t read the.** co
1e860 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67  ntent by setting
1e870 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1e880 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72  ead flag.  Later
1e890 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69   on, if .** sqli
1e8a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1e8b0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  is called on thi
1e8c0 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69  s page or if thi
1e8d0 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
1e8e0 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74  called again wit
1e8f0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20  h noContent==0, 
1e900 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1e910 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  the content is n
1e920 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  eeded.** and the
1e930 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c   disk read shoul
1e940 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
1e950 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1e960 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
1e970 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1e980 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1e990 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1e9a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e9b0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1e9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1e9d0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1e9e0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1e9f0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1ea00 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1ea10 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1ea20 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1ea30 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1ea40 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1ea50 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1ea60 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1ea70 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1ea80 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1ea90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1eaa0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
1eab0 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
1eac0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
1ead0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
1eae0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1eaf0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
1eb00 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
1eb10 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
1eb20 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1eb30 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
1eb40 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
1eb50 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
1eb60 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
1eb70 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
1eb80 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1eb90 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1eba0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ebb0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
1ebc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1ebd0 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
1ebe0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
1ebf0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
1ec00 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1ec10 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  *ppPage = 0;..  
1ec20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1ec30 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
1ec40 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
1ec50 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
1ec60 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
1ec70 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
1ec80 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
1ec90 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
1eca0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
1ecb0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
1ecc0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1ecd0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
1ece0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
1ecf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ed00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1ed10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ed20 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1ed30 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d  LOCK );..  pPg =
1ed40 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1ed50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
1ed60 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1ed70 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1ed80 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
1ed90 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1eda0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
1edb0 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  ;.    int h;.   
1edc0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1edd0 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
1ede0 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61  rc = pagerAlloca
1edf0 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20 26  tePage(pPager, &
1ee00 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1ee10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ee20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ee30 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
1ee40 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
1ee50 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1ee60 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  || pgno>pPager->
1ee70 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  stmtSize );.    
1ee80 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
1ee90 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1eea0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
1eeb0 67 44 62 53 69 7a 65 20 29 7b 0a 23 69 66 20 30  gDbSize ){.#if 0
1eec0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
1eed0 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
1eee0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
1eef0 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66 0a 20 20  no/8);.#endif.  
1ef00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ef10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1ef20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1ef30 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
1ef40 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1ef50 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
1ef60 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
1ef70 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1ef80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ef90 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1efa0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1efb0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
1efc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
1efd0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1efe0 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
1eff0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
1f000 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
1f010 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
1f020 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
1f030 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
1f040 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
1f050 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
1f060 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
1f070 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
1f080 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1f090 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1f0a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1f0b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1f0c0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1f0d0 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71  rrCode;.      sq
1f0e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1f0f0 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  pPg);.      retu
1f100 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1f110 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1f120 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
1f130 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
1f140 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1f150 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
1f160 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
1f170 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
1f180 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
1f190 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
1f1a0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
1f1b0 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
1f1c0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
1f1d0 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
1f1e0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1f1f0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1f200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1f210 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1f220 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1f230 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
1f240 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
1f250 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1f260 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
1f270 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1f280 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1f290 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
1f2a0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1f2b0 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
1f2c0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
1f2d0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1f2e0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
1f2f0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1f300 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
1f310 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
1f320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f330 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1f340 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1f350 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
1f360 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
1f370 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f380 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1f390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1f3b0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1f3c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
1f3d0 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
1f3e0 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
1f3f0 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
1f400 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
1f410 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
1f420 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
1f430 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
1f440 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1f450 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
1f460 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1f470 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
1f480 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
1f490 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1f4a0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
1f4b0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
1f4c0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
1f4d0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
1f4e0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1f4f0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1f500 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
1f510 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1f520 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1f530 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1f540 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1f550 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
1f560 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1f570 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1f580 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1f590 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
1f5a0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
1f5b0 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
1f5c0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
1f5d0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1f5e0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
1f5f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f600 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f620 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
1f630 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
1f640 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1f650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1f660 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
1f670 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1f680 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1f690 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1f6a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f6b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1f6c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1f6d0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1f6e0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1f6f0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1f700 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1f710 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1f720 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1f730 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1f740 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1f750 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1f760 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1f770 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
1f780 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1f790 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63  ;.  rc = pagerAc
1f7a0 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67  quire(pPager, pg
1f7b0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
1f7c0 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c  ntent);.  pagerL
1f7d0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1f7e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1f7f0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
1f800 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
1f810 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
1f820 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
1f830 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
1f840 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
1f850 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
1f860 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
1f870 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
1f880 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
1f890 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
1f8a0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
1f8b0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
1f8c0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1f8d0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1f8e0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
1f8f0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
1f900 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
1f910 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
1f920 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
1f930 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1f940 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
1f950 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
1f960 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
1f970 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
1f980 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
1f990 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
1f9a0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
1f9b0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
1f9c0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
1f9d0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
1f9e0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1f9f0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1fa00 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Pg = 0;..  asser
1fa10 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1fa20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
1fa30 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  0 );..  pagerEnt
1fa40 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
1fa50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1fa60 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1fa70 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1fa80 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
1fa90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1faa0 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ode );.  }else i
1fab0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1fac0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1fad0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1fae0 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  LL ){.    /* Do 
1faf0 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c  nothing */.  }el
1fb00 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70 61  se if( (pPg = pa
1fb10 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1fb20 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a  r, pgno))!=0 ){.
1fb30 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
1fb40 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
1fb50 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
1fb60 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
1fb70 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
1fb80 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
1fb90 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1fba0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1fbb0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
1fbc0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
1fbd0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1fbe0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
1fbf0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
1fc00 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
1fc10 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
1fc20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1fc30 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
1fc40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
1fc50 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
1fc60 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
1fc70 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
1fc80 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1fc90 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1fca0 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
1fcb0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
1fcc0 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
1fcd0 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  age.  */.  asser
1fce0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1fcf0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
1fd00 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70  Pg->pPager);.  p
1fd10 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
1fd20 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43  FINFO(pPg);..  C
1fd30 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1fd40 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
1fd50 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
1fd60 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
1fd70 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
1fd80 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
1fd90 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
1fda0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1fdb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1fdc0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20  ->nRef==0 ){..  
1fdd0 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67    lruListAdd(pPg
1fde0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1fdf0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
1fe00 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1fe10 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c  xDestructor(pPg,
1fe20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1fe30 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1fe40 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
1fe50 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
1fe60 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
1fe70 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
1fe80 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1fe90 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
1fea0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
1feb0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
1fec0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
1fed0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1fee0 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21  r->nRef==0 && (!
1fef0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1ff00 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
1ff10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29  >journalOff>0) )
1ff20 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c  {.      pagerUnl
1ff30 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
1ff40 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ff50 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
1ff60 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1ff70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ff80 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1ff90 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1ffa0 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1ffb0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1ffc0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1ffd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1ffe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fff0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
20000 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
20010 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20020 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
20030 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
20040 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
20050 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
20060 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
20070 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
20080 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
20090 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
200a0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
200b0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
200c0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
200d0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
200e0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
200f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
20100 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
20110 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
20120 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
20130 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
20140 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
20150 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20160 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
20170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20190 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
201a0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
201b0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
201c0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
201d0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
201e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
201f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  t(pPager);.  pag
20200 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
20210 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
20220 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
20230 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65  allocZero( pPage
20240 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
20250 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
20260 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
20270 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
20280 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
20290 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
202a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
202b0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
202c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
202d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
202e0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
202f0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
20300 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
20310 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
20320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
20330 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
20340 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
20350 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  L);.  }.#ifdef S
20360 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
20370 4d 49 43 5f 57 52 49 54 45 0a 20 20 72 63 20 3d  MIC_WRITE.  rc =
20380 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
20390 70 65 6e 28 0a 20 20 20 20 20 20 70 56 66 73 2c  pen(.      pVfs,
203a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
203b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
203c0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
203d0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
203e0 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
203f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
20400 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
20410 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
20420 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
20430 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72  ndif.  assert( r
20440 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
20450 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
20460 74 68 6f 64 73 20 29 3b 0a 20 20 70 50 61 67 65  thods );.  pPage
20470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20480 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
20490 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
204a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
204b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
204c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
204d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
204e0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
204f0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
20500 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
20510 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  urnal, 0);.    }
20520 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
20530 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
20540 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
20550 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
20560 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20570 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
20580 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20590 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
205a0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
205b0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
205c0 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
205d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
205e0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
205f0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
20600 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
20610 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
20620 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
20630 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
20640 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
20650 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
20660 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
20670 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
20680 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
20690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
206a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
206b0 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
206c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
206d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
206e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
206f0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
20700 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
20710 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
20720 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
20730 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
20760 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
20770 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
20780 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
20790 6c 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  l:.  sqlite3_fre
207a0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
207b0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
207c0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
207d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
207e0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
207f0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
20800 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
20810 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
20820 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
20830 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
20840 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
20850 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
20860 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
20870 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
20880 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
20890 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  erRollback() is 
208a0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
208b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
208c0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
208d0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
208e0 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61  gerUnref() is ca
208f0 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79  lled to on every
20900 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
20910 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
20920 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  st parameter to 
20930 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20940 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79  a pointer to any
20950 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68   open page of th
20960 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
20970 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61  le.  Nothing cha
20980 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70  nges about the p
20990 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64  age - it is used
209a0 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63   merely to.** ac
209b0 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20  quire a pointer 
209c0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
209d0 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72  ucture and as pr
209e0 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69  oof that there i
209f0 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72  s.** already a r
20a00 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
20a10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
20a20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  The second param
20a30 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68  eter indicates h
20a40 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e  ow much space in
20a50 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76   bytes to reserv
20a60 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65  e for a.** maste
20a70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e  r journal file-n
20a80 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ame at the start
20a90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20aa0 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74  when it is creat
20ab0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72  ed..**.** A jour
20ac0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
20ad0 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ed if this is no
20ae0 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  t a temporary fi
20af0 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61  le.  For tempora
20b00 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65  ry.** files, the
20b10 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20   opening of the 
20b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20b30 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
20b40 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63  here is an.** ac
20b50 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69  tual need to wri
20b60 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
20b70 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
20b80 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
20b90 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72  ady reserved for
20ba0 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72   writing, this r
20bb0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20bc0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c  p..**.** If exFl
20bd0 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61  ag is true, go a
20be0 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20  head and get an 
20bf0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20c00 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d  n the file.** im
20c10 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61  mediately instea
20c20 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74  d of waiting unt
20c30 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75  il we try to flu
20c40 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
20c50 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20  he.** exFlag is 
20c60 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61  ignored if a tra
20c70 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
20c80 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69  ady active..*/.i
20c90 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
20ca0 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67  egin(DbPage *pPg
20cb0 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20  , int exFlag){. 
20cc0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
20cd0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
20ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20cf0 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  OK;.  pagerEnter
20d00 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
20d10 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
20d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20d30 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
20d40 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
20d50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20d60 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
20d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20d80 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
20d90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
20da0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
20db0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
20dc0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
20dd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
20de0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
20df0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
20e00 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
20e10 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
20e20 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
20e30 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
20e40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20e50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
20e60 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
20e70 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
20e80 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
20e90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20ea0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
20eb0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
20ec0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
20ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20ee0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20f00 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
20f10 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ger);.        re
20f20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20f30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
20f40 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
20f50 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
20f60 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
20f70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20f80 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ger));.      if(
20f90 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
20fa0 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
20fb0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20fc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
20fd0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
20fe0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
20ff0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
21000 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21010 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
21020 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
21030 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
21040 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
21050 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
21060 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c  ve-access mode l
21070 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
21080 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
21090 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
210a0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
210b0 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
210c0 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
210d0 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
210e0 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
210f0 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
21100 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
21110 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20  n and truncated 
21120 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20  to 0 bytes..    
21130 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
21140 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
21150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21160 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
21170 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
21180 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
21190 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
211a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
211b0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
211c0 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
211d0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
211e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
211f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21200 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o( pPager->dbSiz
21210 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 70  e/8 + 1 );.    p
21220 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
21230 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
21240 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
21250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
21260 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
21270 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
21280 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
21290 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
212a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
212b0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
212c0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
212d0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
212e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
212f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21300 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  Off>0 || rc!=SQL
21310 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65  ITE_OK );.  page
21320 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
21330 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21340 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
21350 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74  e dirty.  Set it
21360 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64  s dirty flag and
21370 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64   add it to the d
21380 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73  irty.** page lis
21390 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
213a0 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64  d makeDirty(PgHd
213b0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
213c0 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a  Pg->dirty==0 ){.
213d0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
213e0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
213f0 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
21400 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
21410 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
21420 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70  Dirty;.    if( p
21430 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b  Pager->pDirty ){
21440 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
21450 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
21460 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  y = pPg;.    }. 
21470 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
21480 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
21490 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
214a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
214b0 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e  ake a page clean
214c0 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72  .  Clear its dir
214d0 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76  ty bit and remov
214e0 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  e it from the.**
214f0 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74   dirty page list
21500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21510 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
21520 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
21530 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
21540 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
21550 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69      if( pPg->pDi
21560 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rty ){.      ass
21570 65 72 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79  ert( pPg->pDirty
21580 2d 3e 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50  ->pPrevDirty==pP
21590 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
215a0 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
215b0 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
215c0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
215d0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
215e0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rty ){.      ass
215f0 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44  ert( pPg->pPrevD
21600 69 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50  irty->pDirty==pP
21610 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
21620 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
21630 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
21640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21650 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21660 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d  pPager->pDirty==
21670 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
21680 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
21690 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
216a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
216b0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
216c0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
216d0 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
216e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
216f0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
21700 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
21710 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
21720 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
21730 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
21740 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
21750 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
21760 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
21770 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
21780 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
21790 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
217a0 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
217b0 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
217c0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
217d0 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
217e0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
217f0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
21800 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
21810 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
21820 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
21830 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
21840 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
21850 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
21860 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
21870 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
21880 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
21890 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
218a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
218b0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
218c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
218d0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
218e0 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
218f0 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
21900 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
21910 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
21920 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
21930 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
21940 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
21950 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
21960 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
21970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
21980 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
21990 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
219a0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
219b0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
219c0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
219d0 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
219e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
219f0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
21a00 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
21a10 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
21a20 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg);.  Pager *pP
21a30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
21a40 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
21a50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
21a60 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
21a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
21a80 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
21a90 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
21aa0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
21ab0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
21ac0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
21ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
21ae0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
21af0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
21b00 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
21b10 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
21b20 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61   If this page wa
21b30 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  s previously acq
21b40 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
21b50 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65  tent==1, that me
21b60 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e  ans.  ** we didn
21b70 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69  't really read i
21b80 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
21b90 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
21ba0 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a   can happen.  **
21bb0 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77   (for example) w
21bc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
21bd0 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
21be0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75  he freelist.  Bu
21bf0 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72  t.  ** now we ar
21c00 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69  e (perhaps) movi
21c10 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20  ng the page off 
21c20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
21c30 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61  for.  ** reuse a
21c40 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  nd we need to kn
21c50 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  ow its original 
21c60 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20  content so that 
21c70 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e  content.  ** can
21c80 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
21c90 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21ca0 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72  al.  So do the r
21cb0 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  ead at this.  **
21cc0 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   time..  */.  rc
21cd0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
21ce0 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
21cf0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
21d00 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
21d10 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
21d20 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
21d30 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
21d40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
21d50 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
21d60 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
21d70 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
21d80 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
21d90 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
21da0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
21db0 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  (pageInStatement
21dc0 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d  (pPg) || pPager-
21dd0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
21de0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
21df0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
21e00 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
21e10 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
21e20 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
21e30 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
21e40 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
21e50 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
21e60 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
21e70 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
21e80 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
21e90 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
21ea0 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
21eb0 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
21ec0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21ed0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
21ee0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
21ef0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
21f00 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
21f10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21f20 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
21f30 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
21f40 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
21f50 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  (pPg, 0);.    if
21f60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21f70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21f80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
21f90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21fa0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
21fb0 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
21fc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21fd0 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
21fe0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
21ff0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
22000 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
22010 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
22020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22030 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
22040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22050 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
22060 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
22070 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
22080 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
22090 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
220a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
220b0 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
220c0 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
220d0 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
220e0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
220f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
22100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22110 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
22120 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
22130 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
22140 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
22150 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
22160 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
22170 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
22180 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
22190 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
221a0 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
221b0 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
221c0 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
221d0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
221e0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
221f0 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
22200 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
22210 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
22220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
22230 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
22240 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
22250 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
22260 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
22270 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
22280 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
22290 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
222a0 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
222b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
222c0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
222d0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
222e0 69 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  if( !pHist->pOri
222f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
22300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22310 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
22320 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
22330 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
22340 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
22350 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
22360 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
22370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22380 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
22390 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
223a0 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  a2;..          /
223b0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
223c0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
223d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
223e0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
223f0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
22400 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
22410 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
22420 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
22430 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
22440 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
22450 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
22460 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
22470 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
22480 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
22490 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
224a0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
224b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
224c0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
224d0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
224e0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
224f0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  a2);.          r
22500 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
22510 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
22520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
22530 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
22540 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22560 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22570 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
22580 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
22590 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
225a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
225d0 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
225e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
225f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
22600 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
22610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22620 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22640 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
22650 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
22660 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
22670 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
22680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
22690 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
226a0 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
226b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f    }.          IO
226c0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
226d0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
226e0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
226f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
22700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
22710 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
22720 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
22730 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
22740 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
22750 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
22760 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
22770 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE5("JOURNAL %
22780 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
22790 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
227a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
227b0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
227c0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
227d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
227e0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
227f0 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  g));..          
22800 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
22810 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
22820 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
22830 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
22840 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
22850 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
22860 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
22870 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
22880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
228a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
228b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
228c0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
228d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
228e0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
228f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
22900 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
22910 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
22920 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
22930 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
22940 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
22950 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
22960 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
22970 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
22980 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22990 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
229a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
229b0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
229c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
229d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
229e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
229f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22a00 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
22a10 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
22a20 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
22a30 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
22a40 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
22a50 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
22a60 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
22a70 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
22a80 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
22a90 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
22aa0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
22ab0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
22ac0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
22ad0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
22ae0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
22af0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
22b00 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
22b10 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
22b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
22b30 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
22b40 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
22b50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
22b60 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
22b70 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
22b80 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
22b90 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
22ba0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
22bb0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
22bc0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
22bd0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
22be0 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
22bf0 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
22c00 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
22c10 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
22c20 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
22c30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
22c40 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22c50 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
22c60 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
22c70 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
22c80 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
22c90 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
22ca0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22cb0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
22cc0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
22cd0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
22ce0 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
22cf0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
22d00 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
22d10 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
22d20 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
22d30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22d40 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
22d50 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
22d60 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
22d70 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
22d80 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
22d90 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
22da0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
22db0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
22dc0 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
22dd0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
22de0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
22df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22e00 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
22e10 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
22e20 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
22e30 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22e40 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
22e50 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
22e60 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
22e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22e80 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50   i64 offset = pP
22e90 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28  ager->stmtNRec*(
22ea0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
22eb0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ze);.        cha
22ec0 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
22ed0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
22ee0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
22ef0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
22f00 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
22f10 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->stfd, offset, 
22f20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
22f30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22f50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22f60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
22f70 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  tfd, pData2, pPa
22f80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
22f90 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
22fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
22fb0 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
22fc0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
22fd0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
22fe0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
22ff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23010 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23020 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
23030 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
23040 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
23050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23060 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
23070 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23080 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
23090 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
230a0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
230b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
230c0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
230d0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
230e0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
230f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
23100 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
23110 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
23120 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
23130 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
23140 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23150 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
23160 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
23170 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
23180 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
23190 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
231a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
231b0 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
231c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
231d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
231e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
231f0 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
23200 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
23210 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
23220 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
23230 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
23240 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23250 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
23260 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
23270 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
23280 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
23290 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
232a0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
232b0 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
232c0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
232d0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
232e0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
232f0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
23300 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
23310 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
23320 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
23330 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
23340 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
23350 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
23360 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
23370 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
23380 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
23390 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
233a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
233b0 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
233c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
233d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
233e0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
233f0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
23400 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
23410 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
23420 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
23430 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
23440 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
23450 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
23460 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
23470 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
23480 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
23490 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
234a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
234b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
234c0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
234d0 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
234e0 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
234f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
23500 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
23510 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
23520 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
23530 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
23540 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23550 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
23560 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
23570 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
23580 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
23590 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
235a0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
235b0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
235c0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
235d0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
235e0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
235f0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
23600 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
23610 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
23620 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
23630 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
23640 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
23650 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
23660 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
23670 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
23680 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
23690 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
236a0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
236b0 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
236c0 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
236d0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
236e0 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
236f0 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
23700 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
23710 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
23720 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
23730 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
23740 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
23750 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
23760 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
23770 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
23780 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
23790 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
237a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
237b0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
237c0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
237d0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
237e0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
237f0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
23800 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
23810 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
23820 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
23830 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
23840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23850 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
23860 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
23870 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
23880 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
23890 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
238a0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
238b0 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
238c0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
238d0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
238e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
238f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
23900 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
23910 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
23920 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
23930 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->aInJournal || 
23940 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
23950 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e 70   .          pg>p
23960 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
23970 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61  e || !(pPager->a
23980 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26  InJournal[pg/8]&
23990 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20  (1<<(pg&7))).   
239a0 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69     ) {.        i
239b0 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
239c0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
239d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
239e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
239f0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
23a00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
23a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
23a30 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
23a40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
23a50 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
23a60 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
23a70 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
23a80 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
23a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
23ab0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
23ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23ad0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
23ae0 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
23af0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
23b00 67 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g)) ){.        i
23b10 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79  f( pPage->needSy
23b20 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
23b30 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
23b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23b50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
23b60 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
23b70 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
23b80 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
23b90 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
23ba0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
23bb0 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
23bc0 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
23bd0 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
23be0 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
23bf0 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
23c00 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
23c10 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
23c20 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
23c30 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
23c40 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
23c50 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
23c60 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
23c70 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
23c80 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
23c90 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
23ca0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
23cb0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
23cc0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66  dSync ){.      f
23cd0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
23ce0 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
23cf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
23d00 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
23d10 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
23d20 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
23d30 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70     if( pPage ) p
23d40 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  Page->needSync =
23d50 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
23d60 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
23d70 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
23d80 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
23d90 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
23da0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
23db0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
23dc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
23dd0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
23de0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
23df0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
23e00 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
23e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23e20 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
23e30 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
23e40 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
23e50 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
23e60 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
23e70 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
23e80 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
23e90 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
23ea0 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
23eb0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
23ec0 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
23ed0 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
23ee0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
23ef0 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
23f00 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
23f10 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69  ->dirty;.}.#endi
23f20 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
23f30 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
23f40 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
23f50 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
23f60 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
23f70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
23f80 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
23f90 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
23fa0 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77  qlite3PagerOverw
23fb0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
23fc0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
23fd0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
23fe0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
23ff0 20 72 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74   rc;..  pagerEnt
24000 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
24010 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
24020 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
24030 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
24040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24060 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
24070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
24090 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67  emcpy(sqlite3Pag
240a0 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20  erGetData(pPg), 
240b0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
240c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
240d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
240e0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  Unref(pPg);.  }.
240f0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
24100 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
24110 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
24120 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
24130 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
24140 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
24150 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
24160 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
24170 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
24180 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
24190 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
241a0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
241b0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
241c0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
241d0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
241e0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
241f0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
24200 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
24210 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
24220 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
24230 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
24240 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
24250 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
24260 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
24270 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
24280 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
24290 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
242a0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
242b0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
242c0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
242d0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
242e0 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
242f0 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
24300 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
24310 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
24320 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
24330 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
24340 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
24350 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
24360 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
24370 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
24380 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
24390 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
243a0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
243b0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
243c0 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
243d0 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
243e0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
243f0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
24400 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
24410 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
24420 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
24430 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
24440 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
24450 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
24460 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
24470 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
24480 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
24490 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
244a0 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
244b0 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
244c0 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
244d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
244e0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
244f0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
24500 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
24510 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
24520 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
24530 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
24540 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
24550 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
24560 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
24570 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
24580 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
24590 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
245a0 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
245b0 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
245c0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
245d0 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
245e0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
245f0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
24600 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24610 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
24620 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
24630 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
24640 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
24650 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
24660 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ager;..  if( MEM
24670 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  DB ) return;.  p
24680 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
24690 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
246a0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
246b0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
246c0 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
246d0 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
246e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
246f0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
24700 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
24710 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
24720 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
24730 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
24740 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
24750 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
24760 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
24770 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
24780 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
24790 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
247a0 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
247b0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
247c0 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
247d0 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
247e0 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
247f0 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
24800 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
24810 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
24820 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
24830 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
24840 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
24850 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
24860 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
24870 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
24880 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
24890 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
248a0 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
248b0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
248c0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
248d0 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
248e0 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
248f0 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
24900 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
24910 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
24920 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
24930 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
24940 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
24950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
24960 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57  ERTRACE3("DONT_W
24970 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
24980 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
24990 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
249a0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
249b0 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
249c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
249d0 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61  >pgno)).      ma
249e0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
249f0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
24a00 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
24a10 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
24a20 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
24a30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
24a40 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
24a50 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
24a60 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
24a70 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
24a80 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
24a90 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
24aa0 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
24ab0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
24ac0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
24ad0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
24ae0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
24af0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
24b00 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
24b10 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
24b20 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
24b30 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
24b40 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
24b50 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
24b60 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
24b70 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
24b80 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
24b90 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
24ba0 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
24bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
24bc0 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
24bd0 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
24be0 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
24bf0 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
24c00 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
24c10 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
24c20 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
24c30 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
24c40 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
24c50 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24c60 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
24c70 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
24c80 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
24c90 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ager;..  pagerEn
24ca0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
24cb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
24cc0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
24cd0 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  RVED );.  if( pP
24ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
24cf0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
24d00 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
24d10 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
24d20 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
24d30 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
24d40 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
24d50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
24d60 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
24d70 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
24d80 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
24d90 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
24da0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
24db0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
24dc0 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
24dd0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
24de0 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
24df0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
24e00 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
24e10 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
24e20 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
24e30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
24e40 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
24e50 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
24e60 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
24e70 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
24e80 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
24e90 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
24ea0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
24eb0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
24ec0 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
24ed0 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
24ee0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
24ef0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
24f00 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
24f10 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
24f20 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26  ment(pPg) .   &&
24f30 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
24f40 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
24f50 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  e .  ){.    asse
24f60 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
24f70 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
24f80 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
24f90 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
24fa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
24fb0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
24fc0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
24fd0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
24fe0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
24ff0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
25000 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ave(pPager);.}..
25010 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
25020 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
25030 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64   increment the d
25040 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
25050 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20  nge-counter,.** 
25060 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32  stored at byte 2
25070 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
25080 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
25090 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
250a0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
250b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
250c0 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64  sDirect){.  PgHd
250d0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
250e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
250f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25100 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
25110 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
25120 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
25130 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
25140 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
25150 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
25160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
25170 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
25180 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
25190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
251a0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69  eturn rc;..    i
251b0 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a  f( !isDirect ){.
251c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
251d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
251e0 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Hdr);.      if( 
251f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25210 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
25220 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
25230 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
25240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
25250 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
25260 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
25270 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
25280 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
25290 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
252a0 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
252b0 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
252c0 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63  FileVers);.    c
252d0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
252e0 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28  .    put32bits((
252f0 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f  (char*)PGHDR_TO_
25300 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34  DATA(pPgHdr))+24
25310 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
25320 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69  );..    if( isDi
25330 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rect && pPager->
25340 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
25350 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
25360 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54   *zBuf = PGHDR_T
25370 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a  O_DATA(pPgHdr);.
25380 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25390 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
253a0 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
253b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
253c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
253d0 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
253e0 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
253f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
25400 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
25410 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
25420 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
25430 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25440 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
25450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25460 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
25470 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
25480 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
25490 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
254a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
254b0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
254c0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
254d0 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
254e0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
254f0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
25500 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
25510 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
25520 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
25530 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
25540 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
25550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
25560 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
25570 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
25580 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
25590 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
255a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
255b0 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
255c0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
255d0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
255e0 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
255f0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
25600 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
25610 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
25620 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
25630 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
25640 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
25650 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
25660 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
25670 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
25680 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
25690 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
256a0 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
256b0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
256c0 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
256d0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
256e0 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
256f0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
25700 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
25710 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
25720 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
25730 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
25740 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
25750 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
25760 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
25770 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61  seOne(Pager *pPa
25780 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
25790 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
257a0 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
257b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
257c0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41   PAGERTRACE4("DA
257d0 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
257e0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
257f0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
25800 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
25810 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
25820 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65   nTrunc);.  page
25830 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
25840 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
25850 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
25860 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
25870 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
25880 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a  to, or this.  **
25890 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
258a0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
258b0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
258c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
258d0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
258e0 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d  R_SYNCED && !MEM
258f0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  DB && pPager->di
25900 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
25910 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66  PgHdr *pPg;..#if
25920 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
25930 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
25940 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63     /* The atomic
25950 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
25960 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
25970 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20  if all of the.  
25980 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61    ** following a
25990 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a  re true:.    **.
259a0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
259b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
259c0 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
259d0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
259e0 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
259f0 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
25a00 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20  ge-size, and.   
25a10 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f   **    + This co
25a20 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  mmit is not part
25a30 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
25a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e   transaction, an
25a50 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78  d.    **    + Ex
25a60 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68  actly one page h
25a70 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
25a80 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68   and store in th
25a90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
25aa0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
25ab0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
25ac0 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74  n can be used, t
25ad0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25ae0 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a  file will never.
25af0 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65      ** be create
25b00 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
25b10 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  action..    */. 
25b20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63     int useAtomic
25b30 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20  Write = (.      
25b40 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20    !zMaster && . 
25b50 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
25b60 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
25b70 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
25b80 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54  ) && .        nT
25b90 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20  runc==0 && .    
25ba0 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e      (0==pPager->
25bb0 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61  pDirty || 0==pPa
25bc0 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69  ger->pDirty->pDi
25bd0 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  rty).    );.    
25be0 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69  if( useAtomicWri
25bf0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55  te ){.      /* U
25c00 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66  pdate the nRec f
25c10 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  ield in the jour
25c20 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
25c30 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20     int offset = 
25c40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25c50 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
25c60 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
25c70 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
25c80 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20  >nRec==1);.     
25c90 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
25ca0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f  s(pPager->jfd, o
25cb0 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e  ffset, pPager->n
25cc0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Rec);..      /* 
25cd0 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69  Update the db fi
25ce0 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  le change counte
25cf0 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
25d00 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
25d10 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69  y.      ** the i
25d20 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
25d30 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20  ntation of page 
25d40 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  1 to include the
25d50 20 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a   updated.      *
25d60 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  * change counter
25d70 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
25d80 70 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20  page 1 directly 
25d90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
25da0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42        ** file. B
25db0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74  ecause of the at
25dc0 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
25dd0 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
25de0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20  file-system, .  
25df0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73      ** this is s
25e00 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  afe..      */.  
25e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25e30 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
25e40 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
25e50 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
25e60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
25e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25e80 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
25e90 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
25ea0 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41  }..    if( !useA
25eb0 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63  tomicWrite && rc
25ec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65  ==SQLITE_OK ).#e
25ed0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
25ee0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
25ef0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
25f00 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
25f10 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
25f20 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
25f30 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
25f40 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
25f50 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
25f60 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
25f70 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
25f80 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
25f90 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
25fa0 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
25fb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
25fc0 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
25fd0 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
25fe0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
25ff0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
26000 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
26010 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
26020 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
26030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
26040 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
26050 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26060 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
26070 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 72  lOpen );.      r
26080 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
26090 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
260a0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
260b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
260c0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
260d0 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
260e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
260f0 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
26100 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
26110 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
26120 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
26130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
26140 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
26150 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
26160 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
26170 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
26180 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
26190 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
261a0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
261b0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
261c0 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
261d0 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
261e0 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
261f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
26200 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
26210 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
26220 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
26230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
26240 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
26250 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
26260 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
26270 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
26280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26290 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
262a0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
262b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
262c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
262d0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
262e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
262f0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
26300 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26310 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26320 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
26330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26340 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
26350 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
26360 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
26370 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26380 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
26390 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
263a0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
263b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
263c0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
263d0 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
263e0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
263f0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
26400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26410 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
26420 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
26430 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26440 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
26450 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
26460 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
26470 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
26480 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
26490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
264a0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
264b0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
264c0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
264d0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
264e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
264f0 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
26500 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
26510 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
26520 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
26530 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
26540 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
26550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26560 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67        while( pPg
26570 20 26 26 20 21 70 50 67 2d 3e 64 69 72 74 79 20   && !pPg->dirty 
26580 29 7b 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44  ){ pPg = pPg->pD
26590 69 72 74 79 3b 20 7d 0a 20 20 20 20 20 20 70 50  irty; }.      pP
265a0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
265b0 50 67 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  Pg;.      goto s
265c0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
265d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
265e0 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ty = 0;..    /* 
265f0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
26600 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
26610 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
26620 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
26630 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
26640 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
26650 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
26660 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
26670 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
26680 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
26690 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
266a0 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
266b0 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
266c0 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
266d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
266e0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
266f0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
26700 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
26710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26720 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b  IOERR_BLOCKED ){
26730 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e  .    /* pager_in
26740 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
26750 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74  () may attempt t
26760 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  o obtain an excl
26770 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63  usive.     * loc
26780 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63  k to spill the c
26790 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ache and return 
267a0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42  IOERR_BLOCKED. B
267b0 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a  ut since .     *
267c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
267d0 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73  nce the cache is
267e0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69   inconsistent, i
267f0 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74  t is.     * bett
26800 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  er to return SQL
26810 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a  ITE_BUSY..     *
26820 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
26830 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61  E_BUSY;.  }.  pa
26840 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
26850 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26860 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
26870 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
26880 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
26890 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
268a0 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
268b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
268c0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
268d0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
268e0 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
268f0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
26900 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
26910 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
26920 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
26930 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
26940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26950 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
26960 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
26970 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
26980 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
26990 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
269a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
269b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
269c0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
269d0 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
269e0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
269f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
26a00 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  R;.  }.  pagerEn
26a10 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50  ter(pPager);.  P
26a20 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
26a30 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
26a40 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
26a50 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
26a60 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
26a70 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
26a80 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
26a90 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
26aa0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
26ab0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
26ac0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
26ad0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
26ae0 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
26af0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
26b00 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
26b10 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
26b20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
26b30 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
26b40 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
26b50 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
26b60 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
26b70 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
26b80 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
26b90 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ty;.    }.    pP
26ba0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
26bb0 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
26bc0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
26bd0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
26be0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
26bf0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
26c00 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
26c10 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
26c20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
26c30 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
26c40 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
26c50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
26c60 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
26c70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
26c80 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
26c90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
26ca0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
26cb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
26cc0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
26cd0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
26ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
26cf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
26d00 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
26d10 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
26d20 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26d30 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
26d40 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70  GER_SYNCED || !p
26d50 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
26d60 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  e );.  rc = page
26d70 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
26d80 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  n(pPager);.  rc 
26d90 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
26da0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
26db0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
26dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26dd0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
26de0 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
26df0 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
26e00 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
26e10 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
26e20 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
26e30 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
26e40 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
26e50 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
26e60 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
26e70 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
26e80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
26e90 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
26ea0 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
26eb0 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
26ec0 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
26ed0 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
26ee0 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20  tocol or unless 
26ef0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
26f00 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
26f10 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
26f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
26f30 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
26f40 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
26f50 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
26f60 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
26f70 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
26f80 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
26f90 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
26fa0 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
26fb0 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
26fc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26fd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
26fe0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
26ff0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
27000 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
27010 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
27020 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
27030 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27040 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
27050 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
27060 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
27070 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
27080 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
27090 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
270a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
270b0 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
270c0 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
270d0 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
270e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
270f0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
27100 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
27110 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
27120 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27130 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
27140 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
27150 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
27160 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
27170 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
27180 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
27190 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
271a0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
271b0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
271c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
271d0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
271e0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
271f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
27200 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
27210 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
27220 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
27230 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
27240 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
27250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27260 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
27270 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
27280 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
27290 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
272a0 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
272b0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
272c0 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
272d0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
272e0 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
272f0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
27300 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
27310 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
27320 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
27330 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
27340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
27350 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
27360 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
27370 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e  iter(p, pPager->
27380 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
27390 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
273a0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
273b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
273c0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
273d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
273e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
273f0 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
27400 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
27410 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
27420 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
27430 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27440 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
27450 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27460 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67  E_OK;.  }..  pag
27470 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
27480 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
27490 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
274a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
274b0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
274c0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
274d0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
274e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
274f0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
27500 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
27510 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
27520 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
27530 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
27540 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
27550 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
27560 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
27570 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
27580 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
27590 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
275a0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
275b0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
275c0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
275d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
275e0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
275f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
27600 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
27610 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
27620 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  0);.    rc2 = pa
27630 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
27640 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
27650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
27670 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
27680 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
27690 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
276a0 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f  ger, 0);.  }.  /
276b0 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50  * pager_reset(pP
276c0 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67  ager); */.  pPag
276d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
276e0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
276f0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27700 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
27710 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
27720 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
27730 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
27740 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
27750 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
27760 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
27770 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
27780 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  t..  */.  rc = p
27790 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
277a0 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
277b0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
277c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
277d0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
277e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
277f0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
27800 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
27810 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
27820 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
27830 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
27840 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
27850 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
27860 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
27870 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
27880 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
27890 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
278a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
278b0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
278c0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
278d0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
278e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
278f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
27900 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
27910 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
27920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27930 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
27940 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
27950 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
27960 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
27970 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27980 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
27990 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
279a0 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
279b0 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
279c0 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
279d0 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
279e0 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
279f0 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
27a00 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
27a10 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
27a20 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
27a30 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
27a40 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
27a50 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
27a60 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
27a70 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
27a80 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
27a90 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
27aa0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
27ab0 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
27ac0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27ad0 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
27ae0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
27af0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
27b00 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
27b10 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
27b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
27b30 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
27b40 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
27b50 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
27b60 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
27b70 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
27b80 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
27b90 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
27ba0 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
27bb0 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
27bc0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27bd0 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65 67  int pagerStmtBeg
27be0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
27bf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
27c00 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
27c10 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
27c20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27c30 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
27c40 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
27c50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
27c60 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
27c70 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
27c80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27c90 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
27ca0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
27cb0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
27cc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
27cd0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
27ce0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
27cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27d00 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
27d10 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
27d20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
27d30 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
27d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27d50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
27d60 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
27d70 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67 65  alOpen );.  page
27d80 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27d90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27da0 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a  ->aInStmt==0 );.
27db0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
27dc0 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
27dd0 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64  cZero( pPager->d
27de0 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
27df0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
27e00 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
27e10 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
27e20 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
27e30 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
27e40 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
27e50 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
27e60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
27e70 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
27e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
27e90 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
27ea0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
27eb0 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
27ec0 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
27ed0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
27ee0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27ef0 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
27f00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
27f10 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
27f20 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
27f30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27f40 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
27f50 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
27f60 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
27f70 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
27f80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
27f90 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
27fa0 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
27fb0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
27fc0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
27fd0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
27fe0 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73  emp(pPager->pVfs
27ff0 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
28000 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
28010 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
28040 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66  JOURNAL);.    if
28050 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
28060 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
28070 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
28080 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
28090 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
280a0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
280b0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
280c0 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
280d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
280e0 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
280f0 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
28100 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
28110 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28120 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
28130 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
28140 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
28150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
28160 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
28170 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  mtBegin(Pager *p
28180 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
28190 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
281a0 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
281b0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
281c0 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
281d0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
281e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
281f0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
28200 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
28210 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
28220 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
28230 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65  er){.  pagerEnte
28240 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
28250 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
28260 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
28270 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
28280 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
28290 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
282a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
282b0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
282c0 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  DB ){.      /* s
282d0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
282e0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
282f0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
28300 74 65 33 5f 66 72 65 65 28 20 70 50 61 67 65 72  te3_free( pPager
28310 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
28320 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
28330 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
28340 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  e{.      for(pPg
28350 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
28360 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
28370 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
28380 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
28390 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
283a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
283b0 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70  pNext = pHist->p
283c0 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
283d0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
283e0 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
283f0 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
28400 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48   = 0;.        pH
28410 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
28420 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
28430 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  t = 0;.        s
28440 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
28450 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
28460 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
28470 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
28480 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
28490 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
284a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
284b0 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
284c0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
284d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
284e0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
284f0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
28500 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
28510 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28520 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
28530 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
28540 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52  qlite3PagerStmtR
28550 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
28560 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
28570 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
28580 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
28590 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
285a0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
285b0 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
285c0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
285d0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
285e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
285f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
28600 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
28610 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hist;.      for(
28620 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
28630 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73  t; pPg; pPg=pHis
28640 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  t->pNextStmt){. 
28650 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50         pHist = P
28660 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
28670 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
28680 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
28690 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
286a0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
286b0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
286c0 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
286d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
286e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
286f0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
28700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
28710 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
28720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28730 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
28740 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
28750 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
28760 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
28770 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
28780 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28790 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
287a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
287b0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  stmt_playback(pP
287c0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
287d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
287e0 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
287f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
28800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28810 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
28820 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
28830 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
28840 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
28850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28860 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
28870 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
28880 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
28890 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
288a0 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
288b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
288c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
288d0 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
288e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53  * Return the VFS
288f0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
28900 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e  he pager..*/.con
28910 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  st sqlite3_vfs *
28920 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
28930 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28940 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28950 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pVfs;.}../*.** 
28960 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20  Return the file 
28970 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64  handle for the d
28980 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
28990 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
289a0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
289b0 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55   might return NU
289c0 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68  LL if the file h
289d0 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65  as.** not yet be
289e0 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71  en opened..*/.sq
289f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69  lite3_file *sqli
28a00 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67  te3PagerFile(Pag
28a10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
28a20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
28a30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28a40 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
28a50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
28a60 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
28a70 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
28a80 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  rDirname(Pager *
28a90 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
28aa0 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
28ab0 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
28ac0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
28ad0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
28ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
28af0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
28b00 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
28b10 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
28b20 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
28b30 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
28b40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28b50 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
28b60 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
28b70 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
28b80 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
28b90 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
28ba0 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
28bb0 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
28bc0 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
28bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28be0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28bf0 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64  >noSync;.}..#ifd
28c00 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
28c10 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  DEC./*.** Set th
28c20 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
28c30 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
28c40 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
28c50 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
28c60 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
28c70 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
28c80 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
28c90 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
28ca0 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
28cb0 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
28cc0 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
28cd0 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
28ce0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
28cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28d00 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
28d10 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67  ove the page pPg
28d20 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
28d30 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a  o in the file. .
28d40 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
28d50 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
28d60 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
28d70 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
28d80 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
28d90 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
28da0 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
28db0 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
28dc0 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
28dd0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
28de0 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20  revious located 
28df0 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  at pgno is not a
28e00 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65  lready.** in the
28e10 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
28e20 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74  l, it is not put
28e30 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69   there by by thi
28e40 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
28e50 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
28e60 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61  he page pPg rema
28e70 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
28e80 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
28e90 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
28ea0 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61  ith pPg (i.e. da
28eb0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
28ec0 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
28ed0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
28ee0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
28ef0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
28f00 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
28f10 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
28f20 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
28f30 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
28f40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
28f50 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
28f60 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
28f70 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
28f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
28f90 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
28fa0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
28fb0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
28fc0 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
28fd0 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
28fe0 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
28ff0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
29000 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
29010 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
29020 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
29030 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
29040 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
29050 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
29060 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65  *pPgOld;  /* The
29070 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72   page being over
29080 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e  written. */.  in
29090 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64  t h;.  Pgno need
290a0 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
290b0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
290c0 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
290d0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
290e0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
290f0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
29100 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
29110 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
29120 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29130 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
29140 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
29150 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
29160 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
29170 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
29180 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
29190 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
291a0 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  t(pPg);.  if( pP
291b0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
291c0 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
291d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
291e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
291f0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
29200 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
29210 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
29220 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
29230 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
29240 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
29250 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
29260 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
29270 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  ts hash-chain */
29280 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
29290 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
292a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
292b0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
292c0 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
292d0 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
292e0 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
292f0 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
29300 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
29310 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
29320 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
29330 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
29340 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
29350 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
29360 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
29370 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
29380 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
29390 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  .  pPg->needSync
293a0 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d   = 0;.  pPgOld =
293b0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
293c0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
293d0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
293e0 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
293f0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
29400 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
29410 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
29420 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
29430 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d  PgOld);.    pPg-
29440 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f  >needSync = pPgO
29450 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20  ld->needSync;.  
29460 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
29470 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
29480 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
29490 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
294a0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
294b0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
294c0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
294d0 6c 20 3d 20 20 28 70 50 61 67 65 72 2d 3e 61 49  l =  (pPager->aI
294e0 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
294f0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
29500 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
29510 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
29520 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
29530 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
29540 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f  ==0 || (int)pgno
29550 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
29560 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ize );.  }..  /*
29570 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
29580 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
29590 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
295a0 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
295b0 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  chain. */.  asse
295c0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
295d0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
295e0 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  o;.  h = pgno & 
295f0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
29600 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
29610 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
29620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29630 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
29640 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
29650 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
29660 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
29670 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
29680 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
29690 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
296a0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
296b0 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
296c0 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61  vHash = 0;..  ma
296d0 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
296e0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
296f0 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  he = 1;..  if( n
29700 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
29710 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
29720 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
29730 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
29740 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
29750 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
29760 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
29770 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
29780 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
29790 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
297a0 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
297b0 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
297c0 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
297d0 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
297e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67   the .    ** Pag
297f0 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.aInJournal bi
29800 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  t has been set. 
29810 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
29820 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61   remedied by loa
29830 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ding.    ** the 
29840 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
29850 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
29860 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
29870 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20  needSync flag.. 
29880 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
29890 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
298a0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
298b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
298c0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
298d0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
298e0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
298f0 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
29900 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
29910 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  ;.    PgHdr *pPg
29920 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
29930 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
29940 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
29950 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
29960 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
29970 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
29980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29990 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
299a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
299b0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
299c0 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20  PgHdr->needSync 
299d0 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
299e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
299f0 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50      makeDirty(pP
29a00 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
29a10 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
29a20 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67  Hdr);.  }..  pag
29a30 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
29a40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29a50 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
29a60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
29a70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
29a80 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
29a90 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
29aa0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
29ab0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
29ac0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg){.  return PG
29ad0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
29ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29af0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
29b00 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
29b10 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
29b20 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
29b30 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
29b40 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
29b50 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
29b60 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
29b70 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
29b80 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
29b90 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
29ba0 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
29bb0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
29bc0 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a  Pg, pPager):0);.
29bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
29be0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
29bf0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
29c00 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
29c10 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
29c20 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
29c30 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
29c40 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
29c50 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
29c60 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
29c70 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
29c80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
29c90 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
29ca0 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
29cb0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
29cc0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
29cd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
29ce0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
29cf0 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
29d00 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
29d10 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
29d20 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
29d30 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
29d40 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
29d50 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
29d60 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
29d70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
29d80 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
29d90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
29da0 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
29db0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
29dc0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
29dd0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
29de0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
29df0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
29e00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
29e10 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
29e20 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
29e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
29e40 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
29e50 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
29e60 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
29e70 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
29e80 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
29e90 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
29ea0 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
29eb0 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
29ec0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
29ed0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
29ee0 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20  eMode = eMode;. 
29ef0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
29f00 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
29f10 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65  veMode;.}..#ifde
29f20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
29f30 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
29f40 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
29f50 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
29f60 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
29f70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
29f80 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
29f90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
29fa0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
29fb0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
29fc0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
29fd0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
29fe0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
29ff0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2a000 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2a010 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
2a020 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
2a030 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
2a040 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
2a050 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
2a060 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
2a070 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
2a080 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
2a090 2a 2f 0a                                         */.