/ Hex Artifact Content
Login

Artifact d9aeb0a131ca432f5cf06693a729d0ff818fc9c2:


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: 37 20 32 30 30 38 2f 30 32 2f 31 38 20 31 34 3a  7 2008/02/18 14:
0360: 34 37 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a  47:34 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  E */.  u8 change
3fb0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
3fc0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
3fd0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
3fe0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
3ff0: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
4000: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
4010: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
4020: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
4030: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  ) */.  int errCo
4040: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
4050: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
4060: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
4070: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
4080: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
40a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
40b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
40c0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
40d0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
40e0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
40f0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
4100: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
4110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4120: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
4130: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
4140: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
4150: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4170: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
4180: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4190: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
41a0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
41b0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
41c0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
41d0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
41e0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
41f0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
4200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4210: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
4220: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
4230: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
4260: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
4270: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
4280: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
42b0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
42c0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
42e0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
42f0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
4300: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4320: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
4330: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
4340: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
4350: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4370: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4380: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
4390: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
43a0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
43c0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
43d0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
43e0: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
43f0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
4400: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
4410: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
4420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4430: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
4440: 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  pInStmt;        
4450: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4460: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4470: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4480: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
4490: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
44a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
44b0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
44c0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
44e0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
44f0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
4500: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
4510: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
4520: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4530: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4540: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
4550: 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20  *zStmtJrnl;     
4560: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4570: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
45a0: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a  fd, *jfd;     /*
45b0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
45c0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
45d0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
45e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74  sqlite3_file *st
45f0: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
4600: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
4610: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
4620: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
4630: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
4640: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
4650: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
4660: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
4670: 20 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c    PagerLruList l
4680: 72 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ru;           /*
4690: 20 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65   LRU list of fre
46a0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
46b0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
46c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
46d0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
46e0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4700: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
4710: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
4720: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4730: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20   PgHdr *pDirty; 
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4750: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74  List of all dirt
4760: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34  y pages */.  i64
4770: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4790: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
47a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
47b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
47c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
47d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
47e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
47f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4800: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
4810: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4820: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
4830: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
4840: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
4850: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
4860: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4870: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
4880: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
4890: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
48a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
48c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
48d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
48e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
4910: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
4920: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
4930: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
4940: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
4950: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
4960: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
4970: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
4980: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
4990: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
49a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
49b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
49c0: 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72  id (*xDestructor
49d0: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
49e0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
49f0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
4a00: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
4a10: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
4a20: 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f  bPage*,int);   /
4a30: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4a40: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
4a50: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
4a60: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4a70: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
4a80: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
4a90: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
4aa0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
4ab0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
4ac0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
4ad0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
4ae0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4af0: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23  to xCodec() */.#
4b00: 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73  endif.  int nHas
4b10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
4b20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
4b30: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
4b40: 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ble */.  PgHdr *
4b50: 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20  *aHash;         
4b60: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
4b70: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
4b80: 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a  umber to PgHdr *
4b90: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ba0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
4bb0: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
4bc0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
4bd0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79         /* Doubly
4be0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4bf0: 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20  pagers on which 
4c00: 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65  */.  Pager *pPre
4c10: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4c20: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   /* sqlite3_rele
4c30: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c  ase_memory() wil
4c40: 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20  l work */.  int 
4c50: 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20  iInUseMM;       
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
4c70: 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62  ero if unavailab
4c80: 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e  le to MM */.  in
4c90: 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20  t iInUseDB;     
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
4cb0: 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69  -zero if in sqli
4cc0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4cd0: 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ry() */.#endif. 
4ce0: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
4cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4d00: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
4d10: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
4d20: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63  r tmp use */.  c
4d30: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
4d40: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
4d50: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
4d60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
4d70: 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nges */.};../*.*
4d80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4d90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4da0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4db0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4dc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4dd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4de0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4df0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4e00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4e10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4e20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4e30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4e40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4e50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4e60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4e70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4e80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4e90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ea0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4eb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4ec0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4ed0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ee0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ef0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4f00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4f10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4f20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4f30: 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  al */.int sqlite
4f40: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
4f50: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4f60: 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  Number of cache 
4f70: 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23  pages freed */.#
4f80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4f90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4fa0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4fb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4fc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4fd0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69  ing variable poi
4fe0: 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20  nts to the head 
4ff0: 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b  of a double-link
5000: 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  ed list.** of al
5010: 6c 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72  l pagers that ar
5020: 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70  e eligible for p
5030: 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20  age stealing by 
5040: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72  the.** sqlite3_r
5050: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
5060: 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65  interface.  Acce
5070: 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  ss to this list 
5080: 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20  is.** protected 
5090: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55  by the SQLITE_MU
50a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20  TEX_STATIC_MEM2 
50b0: 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66  mutex..*/.#ifdef
50c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
50d0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
50e0: 0a 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73  .static Pager *s
50f0: 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
5100: 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65  = 0;.static Page
5110: 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33  rLruList sqlite3
5120: 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30  LruPageList = {0
5130: 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a  , 0, 0};.#endif.
5140: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
5150: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
5160: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
5170: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
5180: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
5190: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
51a0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
51b0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
51c0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
51d0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
51e0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
51f0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
5200: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
5210: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
5220: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
5230: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
5240: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
5250: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
5260: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
5270: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5280: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5290: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
52a0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
52b0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
52c0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
52d0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
52e0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
52f0: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5300: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5310: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
5320: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
5330: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
5340: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
5350: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5360: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
5370: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5380: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5390: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
53a0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
53b0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
53c0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
53d0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
53e0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
53f0: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5400: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5410: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
5420: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
5430: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
5440: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
5450: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
5460: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
5470: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5480: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5490: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
54a0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
54b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
54c0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
54d0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
54e0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
54f0: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5500: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5510: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
5520: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5530: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
5540: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
5550: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
5560: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
5570: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5580: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5590: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
55a0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
55b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
55c0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
55d0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
55e0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
55f0: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5600: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5610: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
5620: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
5630: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
5640: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
5650: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
5660: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5670: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5680: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5690: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
56a0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
56b0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
56c0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
56d0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
56e0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
56f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
5700: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
5710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
5720: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
5730: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5740: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
5750: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
5760: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5770: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
5780: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
5790: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
57a0: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
57b0: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
57c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
57d0: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
57e0: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
57f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
5800: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
5810: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
5820: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
5830: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
5840: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
5850: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5860: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
5870: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
5880: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5890: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
58a0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
58b0: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
58c0: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
58d0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
58e0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
58f0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5900: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5910: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5920: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
5930: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
5940: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
5950: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
5960: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
5970: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
5980: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5990: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
59a0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
59b0: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
59c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
59d0: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
59e0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
59f0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
5a00: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
5a10: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
5a20: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
5a30: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
5a40: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
5a50: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
5a60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
5a70: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
5a80: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
5a90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
5aa0: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
5ab0: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
5ac0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
5ad0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
5ae0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
5af0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
5b00: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
5b10: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
5b20: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
5b30: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
5b40: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5b50: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
5b60: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
5b70: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
5b80: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
5b90: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
5ba0: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
5bb0: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
5bc0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5bd0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5be0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5bf0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5c00: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
5c10: 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74 65  ** The pagerEnte
5c20: 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61  r() and pagerLea
5c30: 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63  ve() routines ac
5c40: 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73  quire and releas
5c50: 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20  e.** a mutex on 
5c60: 65 61 63 68 20 70 61 67 65 72 2e 20 20 54 68 65  each pager.  The
5c70: 20 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73   mutex is recurs
5c80: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
5c90: 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72  is a special-pur
5ca0: 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20  pose mutex.  It 
5cb0: 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75  only provides mu
5cc0: 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a  tual exclusion.*
5cd0: 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 42 74  * between the Bt
5ce0: 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f  ree and the Memo
5cf0: 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71  ry Management sq
5d00: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
5d10: 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69  mory().** functi
5d20: 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  on.  It does not
5d30: 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78   prevent, for ex
5d40: 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65  ample, two Btree
5d50: 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67  s from accessing
5d60: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67  .** the same pag
5d70: 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
5d80: 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65  ime.  Other gene
5d90: 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65  ral-purpose mute
5da0: 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74  xes in.** the bt
5db0: 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65  ree layer handle
5dc0: 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a   that chore..*/.
5dd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5de0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
5df0: 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63 20  GEMENT.  static 
5e00: 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72 28  void pagerEnter(
5e10: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70  Pager *p){.    p
5e20: 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20  ->iInUseDB++;.  
5e30: 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d    if( p->iInUseM
5e40: 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44 42  M && p->iInUseDB
5e50: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
5e60: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
5e70: 78 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d  x;.      mutex =
5e80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
5e90: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5ea0: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
5eb0: 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44        p->iInUseD
5ec0: 42 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  B = 0;.      sql
5ed0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5ee0: 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70  (mutex);.      p
5ef0: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a  ->iInUseDB = 1;.
5f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f10: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
5f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
5f30: 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d  rt( p->iInUseMM=
5f40: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  =0 );.  }.  stat
5f50: 69 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61  ic void pagerLea
5f60: 76 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ve(Pager *p){.  
5f70: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b    p->iInUseDB--;
5f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f90: 69 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20  iInUseDB>=0 );. 
5fa0: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
5fb0: 65 20 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a  e pagerEnter(X).
5fc0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65  # define pagerLe
5fd0: 61 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  ave(X).#endif../
5fe0: 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50  *.** Add page pP
5ff0: 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  g to the end of 
6000: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6010: 6d 61 6e 61 67 65 64 20 62 79 20 73 74 72 75 63  managed by struc
6020: 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70  ture.** pList (p
6030: 50 67 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  Pg becomes the l
6040: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
6050: 20 6c 69 73 74 20 2d 20 74 68 65 20 6d 6f 73 74   list - the most
6060: 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73   recently .** us
6070: 65 64 29 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c  ed). Argument pL
6080: 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ink should point
6090: 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e   to either pPg->
60a0: 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72  free or pPg->gfr
60b0: 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67  ee,.** depending
60c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
60d0: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
60e0: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
60f0: 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61  ific or.** globa
6100: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6110: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 41  tatic void listA
6120: 64 64 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  dd(PagerLruList 
6130: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
6140: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6150: 64 72 20 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e  dr *pPg){.  pLin
6160: 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  k->pNext = 0;.  
6170: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70  pLink->pPrev = p
6180: 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69  List->pLast;..#i
6190: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
61a0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
61b0: 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c  MENT.  assert(pL
61c0: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20  ink==&pPg->free 
61d0: 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  || pLink==&pPg->
61e0: 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  gfree);.  assert
61f0: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66  (pLink==&pPg->gf
6200: 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73  ree || pList!=&s
6210: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6220: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  t);.#endif..  if
6230: 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29  ( pList->pLast )
6240: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  {.    int iOff =
6250: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
6260: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 20 20   (char *)pPg;.  
6270: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6280: 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pLastLink = (Pag
6290: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
62a0: 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73  u8 *)pList->pLas
62b0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
62c0: 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  LastLink->pNext 
62d0: 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = pPg;.  }else{.
62e0: 20 20 20 20 61 73 73 65 72 74 28 21 70 4c 69 73      assert(!pLis
62f0: 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20 20 20 20  t->pFirst);.    
6300: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
6310: 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73  pPg;.  }..  pLis
6320: 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  t->pLast = pPg;.
6330: 20 20 69 66 28 20 21 70 4c 69 73 74 2d 3e 70 46    if( !pList->pF
6340: 69 72 73 74 53 79 6e 63 65 64 20 26 26 20 70 50  irstSynced && pP
6350: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
6360: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
6370: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
6380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6390: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
63a0: 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
63b0: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
63c0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 4c  pointed to by pL
63d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ist..**.** Argum
63e0: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
63f0: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6400: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
6410: 67 2d 3e 67 66 72 65 65 2c 20 64 65 70 65 6e 64  g->gfree, depend
6420: 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ing .** on wheth
6430: 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20  er pPg is being 
6440: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67  added to the pag
6450: 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 20 67  er-specific or g
6460: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a  lobal LRU list..
6470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6480: 69 73 74 52 65 6d 6f 76 65 28 50 61 67 65 72 4c  istRemove(PagerL
6490: 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50  ruList *pList, P
64a0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69  agerLruLink *pLi
64b0: 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  nk, PgHdr *pPg){
64c0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63  .  int iOff = (c
64d0: 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63  har *)pLink - (c
64e0: 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64  har *)pPg;..#ifd
64f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6500: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6510: 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  NT.  assert(pLin
6520: 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c  k==&pPg->free ||
6530: 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66   pLink==&pPg->gf
6540: 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ree);.  assert(p
6550: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
6560: 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c  e || pList!=&sql
6570: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29  ite3LruPageList)
6580: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
6590: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
65a0: 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  st ){.    pList-
65b0: 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d  >pFirst = pLink-
65c0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
65d0: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c  ( pPg==pList->pL
65e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ast ){.    pList
65f0: 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d  ->pLast = pLink-
6600: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6610: 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29  ( pLink->pPrev )
6620: 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  {.    PagerLruLi
6630: 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20  nk *pPrevLink = 
6640: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
6650: 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e  (&((u8 *)pLink->
6660: 70 50 72 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20  pPrev)[iOff]);. 
6670: 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e     pPrevLink->pN
6680: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  ext = pLink->pNe
6690: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  xt;.  }.  if( pL
66a0: 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ink->pNext ){.  
66b0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
66c0: 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pNextLink = (Pag
66d0: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
66e0: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78  u8 *)pLink->pNex
66f0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
6700: 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  NextLink->pPrev 
6710: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6720: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
6730: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6740: 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
6750: 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  *p = pLink->pNex
6760: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  t;.    while( p 
6770: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
6780: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 4c 72 75  {.      PagerLru
6790: 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65  Link *pL = (Page
67a0: 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75  rLruLink *)(&((u
67b0: 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20  8 *)p)[iOff]);. 
67c0: 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65       p = pL->pNe
67d0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
67e0: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
67f0: 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c  d = p;.  }..  pL
6800: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69  ink->pNext = pLi
6810: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d  nk->pPrev = 0;.}
6820: 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67  ../* .** Add pag
6830: 65 20 70 50 67 20 74 6f 20 74 68 65 20 6c 69 73  e pPg to the lis
6840: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
6850: 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 20 49  for the pager. I
6860: 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e  f .** memory-man
6870: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6880: 65 64 2c 20 61 6c 73 6f 20 61 64 64 20 74 68 65  ed, also add the
6890: 20 70 61 67 65 20 74 6f 20 74 68 65 20 67 6c 6f   page to the glo
68a0: 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  bal .** list of 
68b0: 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  free pages..*/.s
68c0: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
68d0: 73 74 41 64 64 28 50 67 48 64 72 20 2a 70 50 67  stAdd(PgHdr *pPg
68e0: 29 7b 0a 20 20 6c 69 73 74 41 64 64 28 26 70 50  ){.  listAdd(&pP
68f0: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6900: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6910: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6920: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6930: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6940: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6950: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6960: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6980: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6990: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
69a0: 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69 74 65   listAdd(&sqlite
69b0: 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70  3LruPageList, &p
69c0: 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b  Pg->gfree, pPg);
69d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
69e0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
69f0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6a00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6a10: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6a20: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d  if.}../* .** Rem
6a30: 6f 76 65 20 70 61 67 65 20 70 50 67 20 66 72 6f  ove page pPg fro
6a40: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  m the list of fr
6a50: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
6a60: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
6a70: 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d  r..** If memory-
6a80: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6a90: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f  abled, also remo
6aa0: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6ab0: 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f  global list.** o
6ac0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6ad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6ae0: 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72  ListRemove(PgHdr
6af0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65   *pPg){.  listRe
6b00: 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65  move(&pPg->pPage
6b10: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6b20: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6b30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6b40: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6b50: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6b60: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6b70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b80: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6b90: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6ba0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6bb0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d  U));.    listRem
6bc0: 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50  ove(&sqlite3LruP
6bd0: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6be0: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20  free, pPg);.    
6bf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6c00: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
6c10: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6c20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6c30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
6c40: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
6c50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
6c60: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6e  just after the n
6c70: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73  eedSync flag has
6c80: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a   been cleared.**
6c90: 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20   from all pages 
6ca0: 6d 61 6e 61 67 65 64 20 62 79 20 70 50 61 67 65  managed by pPage
6cb0: 72 20 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75  r (usually becau
6cc0: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
6cd0: 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20  ile.** has just 
6ce0: 62 65 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74  been synced). It
6cf0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 50 61   updates the pPa
6d00: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6d10: 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a  ynced variable.*
6d20: 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79  * and, if memory
6d30: 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
6d40: 6e 61 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69  nabled, the sqli
6d50: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6d60: 46 69 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76  FirstSynced.** v
6d70: 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f  ariable also..*/
6d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6d90: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
6da0: 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
6db0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75  ){.  pPager->lru
6dc0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6dd0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6de0: 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  st;.#ifdef SQLIT
6df0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6e00: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
6e10: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
6e20: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6e40: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6e50: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6e60: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6e70: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28  _LRU));.    for(
6e80: 70 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  p=sqlite3LruPage
6e90: 4c 69 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26  List.pFirst; p &
6ea0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70  & p->needSync; p
6eb0: 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29  =p->gfree.pNext)
6ec0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d  ;.    assert(p==
6ed0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6ee0: 73 74 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73  stSynced || p==s
6ef0: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6f00: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  t.pFirstSynced);
6f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50  .    sqlite3LruP
6f20: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6f30: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71  nced = p;.    sq
6f40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6f50: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6f60: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6f70: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6f80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6f90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
6fa0: 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68 61   if page *pPg ha
6fb0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
6fc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
6fd0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e  atement.** journ
6fe0: 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  al (or statement
6ff0: 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65   snapshot has be
7000: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a  en created, if *
7010: 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f  pPg is part.** o
7020: 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  f an in-memory d
7030: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
7040: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74  tic int pageInSt
7050: 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70  atement(PgHdr *p
7060: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7070: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7080: 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  er;.  if( MEMDB 
7090: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47  ){.    return PG
70a0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
70b0: 20 70 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74   pPager)->inStmt
70c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
70d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
70e0: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
70f0: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
7100: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
7110: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
7120: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
7130: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
7140: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
7150: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
7160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7170: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
7180: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
7190: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
71a0: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
71b0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
71c0: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
71d0: 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
71e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  (pPager);.  sqli
71f0: 74 65 33 46 61 75 6c 74 42 65 6e 69 67 6e 28 53  te3FaultBenign(S
7200: 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43  QLITE_FAULTINJEC
7210: 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20 70 50 61 67  TOR_MALLOC, pPag
7220: 65 72 2d 3e 61 48 61 73 68 21 3d 30 29 3b 0a 20  er->aHash!=0);. 
7230: 20 61 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33   aHash = sqlite3
7240: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
7250: 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29  of(aHash[0])*N )
7260: 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ;.  sqlite3Fault
7270: 42 65 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41  Benign(SQLITE_FA
7280: 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c  ULTINJECTOR_MALL
7290: 4f 43 2c 20 30 29 3b 0a 20 20 70 61 67 65 72 45  OC, 0);.  pagerE
72a0: 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
72b0: 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a  if( aHash==0 ){.
72c0: 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
72d0: 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20  o rehash is not 
72e0: 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73  an error.  It is
72f0: 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61   only a performa
7300: 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20  nce hit. */.    
7310: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
7320: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
7330: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
7340: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
7350: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
7360: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
7370: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7380: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
7390: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
73a0: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
73b0: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
73c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
73d0: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
73e0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
73f0: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
7400: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
7410: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
7420: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
7430: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
7440: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
7450: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
7460: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
7470: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
7480: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
7490: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
74a0: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
74b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
74c0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
74d0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
74e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
74f0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
7500: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
7510: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
7520: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
7530: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
7540: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
7550: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
7560: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
7570: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
7580: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
7590: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
75a0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
75b0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
75c0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
75d0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
75e0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
75f0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
7600: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
7610: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
7620: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
7630: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
7640: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
7650: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
7660: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
7670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7680: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
7690: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
76a0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
76b0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
76c0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
76d0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
76e0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
76f0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
7700: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
7710: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
7720: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
7730: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7740: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
7750: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
7760: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
7770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
7780: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
7790: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
77a0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
77b0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
77c0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
77d0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
77e0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
77f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
7800: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
7810: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
7820: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
7830: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
7840: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
7850: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
7860: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
7870: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
7880: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
7890: 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64  f( !pFd->pMethod
78a0: 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
78b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
78c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
78d0: 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f  sUnlock(pFd, eLo
78e0: 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ck);.}../*.** Th
78f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
7900: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
7910: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
7920: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
7930: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
7940: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
7950: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
7960: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
7970: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
7980: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7990: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
79a0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
79b0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
79c0: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
79d0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
79e0: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
79f0: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
7a00: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7a10: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
7a20: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
7a30: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
7a40: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
7a50: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
7a60: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
7a70: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
7a80: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
7a90: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
7aa0: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
7ab0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
7ac0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
7ad0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
7ae0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
7af0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
7b00: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
7b10: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
7b20: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
7b30: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
7b40: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
7b50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7b60: 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20  .  int dc;      
7b70: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
7b80: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
7b90: 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b  /.  int nSector;
7ba0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
7bb0: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  size */.  int nP
7bc0: 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  age;        /* P
7bd0: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71  age size */.  sq
7be0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
7bf0: 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20   pPager->fd;..  
7c00: 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
7c10: 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   ){.    dc = sql
7c20: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
7c30: 61 63 74 65 72 69 73 74 69 63 73 28 66 64 29 3b  acteristics(fd);
7c40: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73  .    nSector = s
7c50: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
7c60: 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67  ze(fd);.    nPag
7c70: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
7c80: 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Size;.  }..  ass
7c90: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
7ca0: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
7cb0: 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28  >>8));.  assert(
7cc0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7cd0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
7ce0: 38 29 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d  8));..  if( !fd-
7cf0: 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63  >pMethods || (dc
7d00: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
7d10: 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29  TOMIC|(nPage>>8)
7d20: 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67  )&&nSector<=nPag
7d30: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
7d40: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
7d50: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
7d60: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7d80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7d90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
7da0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
7db0: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
7dc0: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
7dd0: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54  pager.** code. T
7de0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7df0: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
7e00: 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
7e10: 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65  cture, the.** se
7e20: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
7e30: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
7e40: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
7e50: 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
7e60: 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  . .** The value 
7e70: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
7e80: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
7e90: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
7ea0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
7eb0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
7ec0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
7ed0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
7ee0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
7ef0: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
7f00: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
7f10: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
7f20: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
7f30: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
7f40: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
7f50: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
7f60: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
7f70: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
7f80: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
7f90: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
7fa0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
7fb0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
7fc0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
7fd0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
7fe0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
7ff0: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
8000: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
8010: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
8020: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
8030: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
8040: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
8050: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
8060: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
8070: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
8080: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  t error occured,
8090: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
80a0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
80b0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
80c0: 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  layed..*/.static
80d0: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
80e0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
80f0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  );.static int pa
8100: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
8110: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
8120: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
8130: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
8140: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
8150: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
8160: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
8170: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
8190: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
81a0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
81b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
81c0: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
81d0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
81e0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
81f0: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
8200: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
8210: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
8220: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
8230: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8240: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
8250: 4f 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  OCK && pPager->n
8260: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
8270: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8280: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
8290: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
82a0: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
82b0: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
82c0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
82d0: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
82e0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
82f0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
8300: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
8310: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
8320: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
8330: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
8340: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8350: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
8360: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
8370: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
8380: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
8390: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
83a0: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
83b0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
83c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
83d0: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
83e0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
83f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
8400: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
8410: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
8420: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
8430: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
8440: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8450: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
8460: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
8470: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
8480: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
8490: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
84a0: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
84b0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
84c0: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
84d0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
84e0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
84f0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
8500: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
8510: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
8520: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
8530: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
8540: 7a 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ze, .           
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 6e               (un
8560: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
8570: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
8580: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  e));.}../*.** Th
8590: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
85a0: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
85b0: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
85c0: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
85d0: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
85e0: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
85f0: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
8600: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
8610: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
8620: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
8630: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
8640: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
8650: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
8660: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
8670: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
8680: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
8690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
86a0: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
86b0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
86c0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
86d0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
86e0: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
86f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
8700: 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e  | MEMDB || pPg->
8710: 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20  dirty || .      
8720: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
8730: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
8740: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
8750: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
8760: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
8770: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
8780: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
8790: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
87a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
87b0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
87c0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
87d0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
87e0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
87f0: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
8800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8810: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
8820: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
8830: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
8840: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
8850: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
8860: 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a  caller. .**.** z
8870: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
8880: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
8890: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
88a0: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
88b0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
88c0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
88d0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
88e0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
88f0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
8900: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
8910: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
8920: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8930: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
8940: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
8950: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8960: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
8970: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
8980: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
8990: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
89a0: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
89b0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
89c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
89d0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
89e0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
89f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74  **.** If no mast
8a00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8a10: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
8a20: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
8a30: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
8a40: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
8a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8a60: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
8a70: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
8a80: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
8a90: 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65  ster, int nMaste
8aa0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
8ab0: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
8ac0: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
8ad0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
8ae0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
8af0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
8b00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
8b10: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
8b20: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
8b30: 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ';..  rc = sqlit
8b40: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
8b50: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
8b60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
8b70: 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72  | szJ<16 ) retur
8b80: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
8b90: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
8ba0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20  szJ-16, &len);. 
8bb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8bc0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8bd0: 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73  .  if( len>=nMas
8be0: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
8bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8c00: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8c10: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
8c20: 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  2, &cksum);.  if
8c30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8c40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8c50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c60: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
8c70: 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69  , 8, szJ-8);.  i
8c80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8c90: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
8ca0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
8cb0: 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63  , 8) ) return rc
8cc0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
8cd0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
8ce0: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
8cf0: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
8d00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8d10: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8d20: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
8d30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a  n] = '\0';..  /*
8d40: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
8d50: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
8d60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8d70: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
8d80: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
8d90: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
8da0: 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20  ster[i];.   }.  
8db0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
8dc0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
8dd0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
8de0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
8df0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
8e00: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
8e10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
8e20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8e30: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
8e40: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
8e50: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
8e60: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
8e70: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
8e80: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
8e90: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
8ea0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
8eb0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
8ec0: 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d      zMaster[0] =
8ed0: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
8ee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8ef0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
8f00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8f10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
8f20: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
8f30: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
8f40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
8f50: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
8f60: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
8f70: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
8f80: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
8f90: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
8fa0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
8fb0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
8fc0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
8fd0: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
8fe0: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
8ff0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9020: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
9040: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
9060: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
9080: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
90a0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
90b0: 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e  c void seekJourn
90c0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
90d0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
90e0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
90f0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9100: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
9110: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
9120: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
9130: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
9140: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
9150: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
9160: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
9170: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9180: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
9190: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
91a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
91b0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
91c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
91d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
91e0: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
91f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9200: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9210: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9220: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9230: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
9240: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
9250: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
9260: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
9270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9280: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
9290: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
92a0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
92b0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
92c0: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
92d0: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
92e0: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
92f0: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
9300: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
9310: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
9320: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
9330: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
9340: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
9350: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
9360: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
9370: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
9380: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
9390: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
93a0: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
93b0: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
93c0: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
93d0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
93e0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
93f0: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
9400: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
9410: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
9420: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
9430: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
9440: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
9450: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
9460: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
9470: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9480: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
9490: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
94a0: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
94b0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
94c0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
94d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
94e0: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
94f0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  r(pPager);.  pPa
9500: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9510: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9520: 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  lOff;..  memcpy(
9530: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
9540: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9550: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
9560: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
9570: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
9580: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
9590: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
95a0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
95b0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
95c0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
95d0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
95e0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
95f0: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
9600: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
9610: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
9620: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
9630: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
9640: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
9650: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
9660: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
9670: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
9680: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
9690: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
96a0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
96b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
96c0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
96d0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
96e0: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
96f0: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
9700: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
9710: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
9720: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
9730: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
9740: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
9750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9760: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
9770: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
9780: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
9790: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
97a0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
97b0: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
97c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
97d0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
97e0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
97f0: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
9800: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
9810: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
9820: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
9830: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
9840: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
9850: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
9860: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
9870: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
9880: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
9890: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
98a0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
98b0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
98c0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
98d0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
98e0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
98f0: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
9900: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
9910: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
9920: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
9930: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9940: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9950: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
9960: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
9970: 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20  >noSync);.  if( 
9980: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
9990: 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33   .   || (sqlite3
99a0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
99b0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
99c0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
99d0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
99e0: 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74   ){.    put32bit
99f0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9a00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9a10: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
9a20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74    }else{.    put
9a30: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9a40: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9a50: 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a  agic)], 0);.  }.
9a60: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
9a70: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
9a80: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
9a90: 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28  lite3Randomness(
9aa0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
9ab0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
9ac0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
9ad0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
9ae0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9af0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
9b00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9b10: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
9b20: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
9b30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
9b40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9b50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9b60: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  8], pPager->dbSi
9b70: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
9b80: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
9b90: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
9ba0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
9bb0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9bc0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9bd0: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
9be0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54  ctorSize);.  IOT
9bf0: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
9c00: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
9c10: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
9c20: 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48  alHdr, sizeof(zH
9c30: 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20  eader))).  rc = 
9c40: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
9c60: 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
9c70: 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a 6f 75  der),pPager->jou
9c80: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67  rnalOff);.  pPag
9c90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9ca0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9cb0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
9cc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
9cd0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
9ce0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
9cf0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
9d00: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
9d10: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
9d20: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9d30: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
9d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9d60: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
9d70: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
9d80: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9d90: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
9da0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9db0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9dc0: 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50 61 67   "\000", 1, pPag
9dd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
9de0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9df0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
9e00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e10: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
9e20: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
9e30: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
9e40: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
9e50: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
9e60: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
9e70: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
9e80: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
9e90: 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f  .** file. See co
9ea0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
9eb0: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
9ec0: 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65  alHdr() for a de
9ed0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
9ee0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9ef0: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
9f00: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
9f10: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
9f20: 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65  lly, *nRec is se
9f30: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
9f40: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
9f50: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
9f60: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62  s header and *db
9f70: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
9f80: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
9f90: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
9fa0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
9fb0: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
9fc0: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
9fd0: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
9fe0: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
9ff0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
a000: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
a010: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
a020: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
a030: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
a040: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
a050: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
a060: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
a070: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
a080: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
a090: 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a  *nRec and *dbSiz
a0a0: 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20  e are not set.  
a0b0: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
a0c0: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
a0d0: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
a0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a0f0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
a100: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
a110: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
a120: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
a130: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34   *pPager, .  i64
a140: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20   journalSize,.  
a150: 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75  u32 *pNRec, .  u
a160: 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20  32 *pDbSize.){. 
a170: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
a180: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
a190: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
a1a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
a1b0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
a1c0: 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a 20 20 73 65  4 jrnlOff;..  se
a1d0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
a1e0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
a1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
a200: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a210: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
a220: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
a230: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a240: 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70   }.  jrnlOff = p
a250: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a260: 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  f;..  rc = sqlit
a270: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
a280: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
a290: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72  zeof(aMagic), jr
a2a0: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
a2b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a2c0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f  jrnlOff += sizeo
a2d0: 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66  f(aMagic);..  if
a2e0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
a2f0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a300: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
a310: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a320: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
a330: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
a340: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a350: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63  , jrnlOff, pNRec
a360: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a370: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a380: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a390: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a3a0: 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  +4, &pPager->cks
a3b0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
a3c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a3d0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a3e0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a3f0: 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a  rnlOff+8, pDbSiz
a400: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
a410: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
a420: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
a430: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
a440: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
a450: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
a460: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
a470: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
a480: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
a490: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
a4a0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a4b0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
a4c0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
a4d0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
a4e0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
a4f0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
a500: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
a510: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
a520: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
a530: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
a540: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
a550: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
a560: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
a570: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a580: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20  fd, jrnlOff+12, 
a590: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
a5a0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
a5b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a5c0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
a5d0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
a5e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a5f0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
a600: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
a610: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
a620: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
a630: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
a640: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
a650: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
a660: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
a670: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
a680: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a690: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
a6a0: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
a6b0: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
a6c0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
a6d0: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
a6e0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
a6f0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
a700: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
a710: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
a720: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
a730: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
a740: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
a750: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
a760: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
a770: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
a780: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
a790: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
a7a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
a7b0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
a7c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
a7d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a7e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
a7f0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
a800: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
a810: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a820: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
a830: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
a840: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
a850: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
a860: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
a870: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
a880: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
a890: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
a8a0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
a8b0: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
a8c0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
a8d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
a8e0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
a8f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
a910: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
a920: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
a930: 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c  t i; .  i64 jrnl
a940: 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  Off;.  u32 cksum
a950: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
a960: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
a970: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
a980: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
a990: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a9a0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
a9b0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
a9c0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
a9d0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
a9e0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
a9f0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
aa00: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
aa10: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
aa20: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
aa30: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
aa40: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
aa50: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
aa60: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
aa70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
aa80: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
aa90: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
aaa0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
aab0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
aac0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
aad0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
aae0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
aaf0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
ab00: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
ab10: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a  pPager);.  }.  j
ab20: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
ab30: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
ab40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ab50: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
ab60: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
ab70: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
ab80: 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d  jrnlOff, PAGER_M
ab90: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
aba0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
abb0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
abc0: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34  ;.  jrnlOff += 4
abd0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
abe0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
abf0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
ac00: 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  en, jrnlOff);.  
ac10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ac20: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
ac30: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b   jrnlOff += len;
ac40: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
ac50: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
ac60: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
ac70: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
ac80: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
ac90: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
aca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
acb0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
acc0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
acd0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
ace0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
acf0: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
ad00: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
ad10: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
ad20: 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nc;.  return rc;
ad30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
ad40: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
ad50: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
ad60: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
ad70: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61  re in the.** sta
ad80: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
ad90: 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20  **.** The Pager 
ada0: 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65  keeps a separate
adb0: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74   list of pages t
adc0: 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
add0: 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74  y in.** the stat
ade0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
adf0: 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73  This helps the s
ae00: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
ae10: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
ae20: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
ae30: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
ae40: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
ae50: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
ae60: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
ae70: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
ae80: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
ae90: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
aea0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
aeb0: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
aec0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
aed0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
aee0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
aef0: 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
af00: 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
af10: 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
af20: 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b  assert( MEMDB );
af30: 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69  .  if( !pHist->i
af40: 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  nStmt ){.    ass
af50: 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65  ert( pHist->pPre
af60: 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73  vStmt==0 && pHis
af70: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  t->pNextStmt==0 
af80: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
af90: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
afa0: 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28    PGHDR_TO_HIST(
afb0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70  pPager->pStmt, p
afc0: 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d  Pager)->pPrevStm
afd0: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
afe0: 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53     pHist->pNextS
aff0: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
b000: 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  tmt;.    pPager-
b010: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
b020: 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
b030: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
b040: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
b050: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
b060: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
b070: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
b080: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
b090: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
b0a0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
b0b0: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
b0c0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
b0d0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
b0e0: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
b0f0: 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  p;.  if( pPager-
b100: 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75  >aHash==0 ) retu
b110: 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67  rn 0;.  p = pPag
b120: 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26  er->aHash[pgno &
b130: 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
b140: 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  1)];.  while( p 
b150: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
b160: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
b170: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
b180: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
b190: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d  ** Clear the in-
b1a0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
b1b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
b1c0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
b1d0: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
b1e0: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
b1f0: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
b200: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
b210: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
b220: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
b230: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
b240: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
b250: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
b260: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
b270: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
b280: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
b290: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
b2a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b2b0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
b2c0: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61  pNext;.  if( pPa
b2d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
b2e0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67  eturn;.  for(pPg
b2f0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
b300: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
b310: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
b320: 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
b330: 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
b340: 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  ));.    PAGER_IN
b350: 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
b360: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
b370: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
b380: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 6c  >pNextAll;.    l
b390: 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
b3a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b3b0: 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b  ree(pPg->pData);
b3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b3d0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73  e(pPg);.  }.  as
b3e0: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
b3f0: 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61  .pFirst==0);.  a
b400: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72  ssert(pPager->lr
b410: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  u.pFirstSynced==
b420: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  0);.  assert(pPa
b430: 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d  ger->lru.pLast==
b440: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  0);.  pPager->pS
b450: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  tmt = 0;.  pPage
b460: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70  r->pAll = 0;.  p
b470: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
b480: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  0;.  pPager->nHa
b490: 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sh = 0;.  sqlite
b4a0: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
b4b0: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
b4c0: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
b4d0: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b  ager->aHash = 0;
b4e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
b4f0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  = 0;.}../*.** Un
b500: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
b510: 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
b520: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
b530: 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f  urrently in erro
b540: 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64  r state, discard
b550: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b560: 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61   .** the cache a
b570: 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67  nd reset the Pag
b580: 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  er structure int
b590: 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20  ernal state. If 
b5a0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f  there is.** an o
b5b0: 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  pen journal-file
b5c0: 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20  , then the next 
b5d0: 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f  time a shared-lo
b5e0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  ck is obtained.*
b5f0: 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66  * on the pager f
b600: 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20  ile (by this or 
b610: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
b620: 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a  s), it will be.*
b630: 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68  * treated as a h
b640: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72  ot-journal and r
b650: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73  olled back..*/.s
b660: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
b670: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
b680: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
b690: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
b6a0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Mode ){.    if( 
b6b0: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
b6c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
b6d0: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
b6e0: 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61      osUnlock(pPa
b6f0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
b700: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b710: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
b720: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52  = -1;.      IOTR
b730: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
b740: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
b750: 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e      /* If Pager.
b760: 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
b770: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b780: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
b790: 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 20 20  cannot be.      
b7a0: 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
b7b0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66  that the pager f
b7c0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
b7d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b7e0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
b7f0: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
b800: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
b810: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
b820: 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  leared..      */
b830: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
b840: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b850: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b860: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
b870: 4b 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  K;.        pager
b880: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b890: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
b8a0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
b8b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b8c0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
b8d0: 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20 20 20  >stfd);.        
b8e0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
b8f0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
b900: 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  InStmt);.       
b910: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
b920: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
b930: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
b940: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b950: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
b960: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
b970: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
b980: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
b990: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
b9a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b9b0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
b9c0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
b9d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
b9e0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
b9f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
ba00: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
ba10: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  tmtOpen = 0;.   
ba20: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
ba30: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
ba40: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ba50: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
ba60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ba70: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
ba80: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
ba90: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
baa0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
bab0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
bac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bad0: 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
bae0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
baf0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
bb00: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
bb10: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
bb20: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65  OCK;.      pPage
bb30: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
bb40: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ne = 0;.    }.  
bb50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
bb60: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
bb70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
bb80: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
bb90: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
bba0: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
bbb0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
bbc0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
bbd0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a  error state, .**
bbe0: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
bbf0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  the rollback..*/
bc00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
bc10: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
bc20: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
bc30: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
bc40: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
bc50: 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  D || p->journalO
bc60: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pen==0 );.  if( 
bc70: 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  p->errCode==SQLI
bc80: 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74  TE_OK && p->stat
bc90: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
bca0: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
bcb0: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29  PagerRollback(p)
bcc0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
bcd0: 6c 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72  lock(p);.  asser
bce0: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
bcf0: 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e   !p->journalOpen
bd00: 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76   || (p->exclusiv
bd10: 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e  eMode&&!p->journ
bd20: 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65  alOff) );.  asse
bd30: 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c  rt( p->errCode |
bd40: 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c  | !p->stmtOpen |
bd50: 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  | p->exclusiveMo
bd60: 64 65 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  de );.}../*.** T
bd70: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73  his routine ends
bd80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
bd90: 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
bda0: 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65  s ended by eithe
bdb0: 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72  r.** a COMMIT or
bdc0: 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a   a ROLLBACK..**.
bdd0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
bde0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
bdf0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
be00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
be10: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53  pen and.** a RES
be20: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
be30: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
be40: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
be50: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65  outine will rele
be60: 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ase.** the datab
be70: 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ase lock and acq
be80: 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c  uires a SHARED l
be90: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
bea0: 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74   if that is.** t
beb0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  he appropriate t
bec0: 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c  hing to do.  Rel
bed0: 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c  ease locks usual
bee0: 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  ly is appropriat
bef0: 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20  e,.** unless we 
bf00: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
bf10: 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20   access mode or 
bf20: 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61  unless this is a
bf30: 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20   .** COMMIT AND 
bf40: 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43  BEGIN or ROLLBAC
bf50: 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72  K AND BEGIN oper
bf60: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
bf70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
bf80: 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20   either deleted 
bf90: 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a  or truncated..**
bfa0: 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64  .** TODO: Consid
bfb0: 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a  er keeping the j
bfc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
bfd0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   for temporary d
bfe0: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69  atabases..** Thi
bff0: 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  s might give a p
c000: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
c010: 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77  vement on window
c020: 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a  s where opening.
c030: 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20  ** a file is an 
c040: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
c050: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
c060: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
c070: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
c080: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
c090: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
c0a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
c0b0: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
c0c0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  OK;.  assert( !M
c0d0: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
c0e0: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
c0f0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
c100: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c110: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
c120: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
c130: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
c140: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
c150: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63   && !pPager->exc
c160: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
c170: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c180: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
c190: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
c1a0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
c1b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
c1c0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69  nalOpen ){.    i
c1d0: 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
c1e0: 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20  siveMode .      
c1f0: 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
c200: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
c210: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d  Pager->jfd, 0))=
c220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20  =SQLITE_OK ){;. 
c230: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c240: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
c250: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c260: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
c270: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c280: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c290: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c2a0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c2b0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
c2c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c2d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
c2e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
c2f0: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
c300: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
c310: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
c320: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c330: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
c340: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c350: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
c360: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
c370: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
c380: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
c390: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
c3a0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
c3b0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c3c0: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
c3d0: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
c3e0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
c3f0: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
c400: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
c410: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c420: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
c430: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c440: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
c450: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
c460: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
c470: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c480: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
c490: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
c4a0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
c4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c4c0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
c4d0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
c4e0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
c4f0: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
c500: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
c510: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
c520: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c530: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
c540: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
c550: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
c560: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
c570: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
c580: 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  HARED;.  }else i
c590: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c5a0: 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29  ==PAGER_SYNCED )
c5b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
c5c0: 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
c5d0: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61  USIVE;.  }.  pPa
c5e0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
c5f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
c600: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
c610: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
c620: 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53   = 0;.  lruListS
c630: 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50  etFirstSynced(pP
c640: 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
c650: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
c660: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
c670: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
c680: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
c690: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
c6a0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
c6b0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
c6c0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
c6d0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
c6e0: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
c6f0: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
c700: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
c710: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
c720: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
c730: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
c740: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
c750: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
c760: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
c770: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
c780: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
c790: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
c7a0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
c7b0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
c7c0: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
c7d0: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
c7e0: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
c7f0: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
c800: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
c810: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
c820: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
c830: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
c840: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
c850: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
c860: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
c870: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
c880: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
c890: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
c8a0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
c8b0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
c8c0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
c8d0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
c8e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
c8f0: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
c900: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
c910: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
c920: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
c930: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
c940: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
c950: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
c960: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
c970: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
c980: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
c990: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
c9a0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
c9b0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
c9c0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
c9d0: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
c9e0: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
c9f0: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
ca00: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
ca10: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
ca20: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
ca30: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
ca40: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
ca50: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
ca60: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
ca70: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
ca80: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
ca90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
caa0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
cab0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
cac0: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
cad0: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
cae0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
caf0: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
cb00: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
cb10: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
cb20: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
cb30: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
cb40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
cb50: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  cksum;.}../* For
cb60: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
cb70: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
cb80: 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a  makeClean(PgHdr*
cb90: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  );../*.** Read a
cba0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
cbb0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
cbc0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
cbd0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
cbe0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
cbf0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
cc00: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
cc10: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
cc20: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
cc30: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
cc40: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
cc50: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
cc60: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
cc70: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
cc80: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
cc90: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
cca0: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
ccb0: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
ccc0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
ccd0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
cce0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
ccf0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
cd00: 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66 73 65  jfd,.  i64 offse
cd10: 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b 73 75  t,.  int useCksu
cd20: 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  m.){.  int rc;. 
cd30: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd50: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
cd60: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
cd70: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
cda0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
cdb0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
cdc0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cde0: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
cdf0: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
ce00: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
ce10: 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72  a = (u8 *)pPager
ce20: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f  ->pTmpSpace;   /
ce30: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66  * Temp storage f
ce40: 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20  or a page */..  
ce50: 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75  /* useCksum shou
ce60: 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74  ld be true for t
ce70: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ce80: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20  and false for.  
ce90: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
cea0: 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74  rnals.  Verify t
ceb0: 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61  hat this is alwa
cec0: 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f  ys the case.  */
ced0: 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d  .  assert( jfd =
cee0: 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50  = (useCksum ? pP
cef0: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
cf00: 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61  er->stfd) );.  a
cf10: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a  ssert( aData );.
cf20: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
cf30: 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ts(jfd, offset, 
cf40: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
cf50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
cf60: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
cf70: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
cf80: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
cf90: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
cfa0: 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  et+4);.  if( rc!
cfb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
cfc0: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
cfd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
cfe0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cff0: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
d000: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
d010: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
d020: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
d030: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
d040: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
d050: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
d060: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
d070: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
d080: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
d090: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
d0a0: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
d0b0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
d0c0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
d0d0: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
d0e0: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
d0f0: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
d100: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
d110: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
d120: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
d130: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
d140: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
d150: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
d160: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
d170: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
d180: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
d190: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
d1a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d1b0: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
d1c0: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
d1d0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f  ead32bits(jfd, o
d1e0: 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61  ffset+pPager->pa
d1f0: 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d  geSize+4, &cksum
d200: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
d210: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
d220: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d230: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
d240: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
d250: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
d260: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
d270: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
d280: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
d290: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
d2a0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
d2b0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
d2c0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
d2d0: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
d2e0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d2f0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
d300: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
d310: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
d320: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
d330: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
d340: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
d350: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
d360: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
d370: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
d380: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
d390: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
d3a0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
d3b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
d3c0: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
d3d0: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
d3e0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
d3f0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
d400: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
d410: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
d420: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
d430: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
d440: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
d450: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
d460: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
d470: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
d480: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
d490: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
d4a0: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
d4b0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
d4c0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
d4d0: 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
d4e0: 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
d4f0: 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
d500: 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
d510: 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
d520: 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
d530: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
d540: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
d550: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
d560: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
d570: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
d580: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
d590: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
d5a0: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
d5b0: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
d5c0: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
d5d0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
d5e0: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
d5f0: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
d600: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
d610: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
d620: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
d630: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
d640: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d650: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
d660: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
d670: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
d680: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
d690: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
d6a0: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
d6b0: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
d6c0: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
d6d0: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
d6e0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
d6f0: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
d700: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
d710: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
d720: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
d730: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
d740: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
d750: 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
d760: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
d770: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
d780: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
d790: 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
d7a0: 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
d7b0: 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
d7c0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
d7d0: 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
d7e0: 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
d7f0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
d800: 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
d810: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
d820: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
d830: 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
d840: 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
d850: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
d860: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
d870: 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
d880: 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
d890: 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
d8a0: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
d8b0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
d8c0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
d8d0: 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
d8e0: 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
d8f0: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
d900: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
d910: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
d920: 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
d930: 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
d940: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
d950: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
d960: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
d970: 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52  pgno);.  PAGERTR
d980: 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE4("PLAYBACK %
d990: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
d9a0: 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
d9b0: 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
d9c0: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
d9d0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
d9e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
d9f0: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70  aData));.  if( p
da00: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
da10: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
da20: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
da30: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b  >needSync==0) ){
da40: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
da50: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
da60: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
da70: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
da80: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
da90: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
daa0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
dab0: 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
dac0: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
dad0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
dae0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
daf0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
db00: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
db10: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
db20: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
db30: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
db40: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
db50: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
db60: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
db70: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
db80: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
db90: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
dba0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
dbb0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
dbc0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
dbd0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
dbe0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
dbf0: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
dc00: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
dc10: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
dc20: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
dc30: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
dc40: 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61  *pData;.    /* a
dc50: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
dc60: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
dc70: 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44  ==1 ); */.    pD
dc80: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
dc90: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
dca0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
dcb0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
dcc0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
dcd0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
dce0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
dcf0: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20  >xReiniter(pPg, 
dd00: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
dd10: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
dd20: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
dd30: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
dd40: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
dd50: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
dd60: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
dd70: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
dd80: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
dd90: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
dda0: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
ddb0: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
ddc0: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
ddd0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
dde0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
ddf0: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
de00: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
de10: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
de20: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
de30: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
de40: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
de50: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
de60: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
de70: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
de80: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
de90: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
dea0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
deb0: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
dec0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
ded0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dee0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
def0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
df00: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
df10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
df20: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
df30: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
df40: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
df50: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
df60: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
df70: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
df80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
df90: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
dfa0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
dfb0: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
dfc0: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
dfd0: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
dfe0: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
dff0: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
e000: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
e010: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e020: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
e030: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
e040: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
e050: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
e060: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
e070: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
e080: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
e090: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
e0a0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
e0b0: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
e0c0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
e0d0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
e0e0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
e0f0: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
e100: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
e110: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
e120: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
e130: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
e140: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
e150: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
e160: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
e170: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
e180: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e190: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
e1a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
e1b0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
e1c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e1d0: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
e1e0: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
e1f0: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
e200: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
e210: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
e220: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e230: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
e240: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
e250: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
e260: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e270: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
e280: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e290: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
e2a0: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
e2b0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
e2c0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
e2d0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
e2e0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
e2f0: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
e300: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
e310: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
e320: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
e330: 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  _malloc(pVfs->sz
e340: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
e350: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
e360: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
e370: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
e380: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
e390: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
e3a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
e3c0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
e3d0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
e3e0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
e3f0: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
e400: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
e410: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
e420: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
e430: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
e440: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e450: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
e460: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
e470: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
e480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
e490: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
e4a0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
e4b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e4c0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
e4d0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
e4e0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
e4f0: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
e500: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
e510: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
e520: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
e530: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
e540: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
e550: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
e560: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
e570: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e580: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
e590: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
e5a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
e5b0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
e5c0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
e5d0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
e5e0: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
e5f0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
e600: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  e3_malloc(nMaste
e610: 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
e620: 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20  erPtr);.    if( 
e630: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
e640: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e650: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e660: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
e670: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
e680: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
e690: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
e6a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20  sterJournal];.  
e6b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e6c0: 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
e6d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
e6e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
e6f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e700: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
e710: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
e720: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
e730: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
e740: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
e750: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
e760: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
e770: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
e780: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
e790: 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
e7a0: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
e7b0: 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  STS) ){.        
e7c0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
e7d0: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
e7e0: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
e7f0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
e800: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
e810: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
e820: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
e830: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
e840: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
e850: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
e860: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
e870: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e880: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
e890: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
e8a0: 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
e8b0: 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
e8c0: 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
e8d0: 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
e8e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
e8f0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
e900: 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
e910: 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
e920: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
e930: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e940: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
e950: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
e960: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e970: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
e980: 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
e990: 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
e9a0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
e9b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e9c0: 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
e9d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
e9e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e9f0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ea00: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ea10: 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
ea20: 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
ea30: 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
ea40: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
ea50: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  0;.        if( c
ea60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
ea70: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
ea80: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
ea90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
eaa0: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
eab0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
eac0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ead0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
eae0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
eaf0: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
eb00: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
eb10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
eb20: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
eb30: 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
eb40: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
eb50: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
eb60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
eb70: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
eb80: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
eb90: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
eba0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ebb0: 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  se(pMaster);.  }
ebc0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ebd0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
ebe0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
ebf0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
ec00: 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
ec10: 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a  r *pPager);../*.
ec20: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
ec30: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
ec40: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
ec50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ec60: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
ec70: 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20  . Also truncate 
ec80: 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72 65  the cached repre
ec90: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
eca0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67   file..**.** Mig
ecb0: 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ht might be the 
ecc0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
ecd0: 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
ece0: 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65  aller than nPage
ecf0: 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61  ..** This can ha
ed00: 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  ppen, for exampl
ed10: 65 2c 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  e, if we are in 
ed20: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20  the middle of a 
ed30: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
ed40: 68 69 63 68 20 68 61 73 20 65 78 74 65 6e 64 65  hich has extende
ed50: 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  d the file size 
ed60: 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61 67 65  and the new page
ed70: 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20  s are still all 
ed80: 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65  held.** in cache
ed90: 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54  , then an INSERT
eda0: 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65 73 20   or UPDATE does 
edb0: 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  a statement roll
edc0: 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f  back.  Some.** o
edd0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
ede0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
edf0: 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
ee00: 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a   if you try to.*
ee10: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
ee20: 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
ee30: 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
ee40: 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20  an it currently 
ee50: 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74  is,.** so detect
ee60: 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 64   this case and d
ee70: 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 75  o not do the tru
ee80: 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ncation..*/.stat
ee90: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
eea0: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
eeb0: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
eec0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
eed0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
eee0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
eef0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 70  R_EXCLUSIVE && p
ef00: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
ef10: 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63  ods ){.    i64 c
ef20: 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
ef30: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
ef40: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
ef50: 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
ef60: 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
ef70: 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ewSize = pPager-
ef80: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
ef90: 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
efa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
efb0: 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
efc0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ze ){.      rc =
efd0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
efe0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
eff0: 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  ewSize);.    }. 
f000: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
f010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
f020: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
f030: 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Page;.    pager_
f040: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
f050: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
f060: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f070: 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Set the sector
f080: 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76  Size for the giv
f090: 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  en pager..**.** 
f0a0: 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
f0b0: 69 73 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  is the larger of
f0c0: 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
f0d0: 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20   reported.** by 
f0e0: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
f0f0: 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20 70 61  ize() and the pa
f100: 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  geSize..*/.stati
f110: 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
f120: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
f130: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50  er){.  assert(pP
f140: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
f150: 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
f160: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50  File);.  if( !pP
f170: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
f180: 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
f190: 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
f1a0: 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
f1b0: 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
f1c0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
f1d0: 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
f1e0: 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
f1f0: 77 68 63 69 68 20 63 61 73 65 20 74 68 65 20 4f  whcih case the O
f200: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
f210: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
f220: 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a  egfault..    */.
f230: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
f240: 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
f250: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
f260: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20  ger->fd);.  }.  
f270: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
f280: 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 70  orSize<pPager->p
f290: 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 70  ageSize ){.    p
f2a0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
f2b0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
f2c0: 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Size;.  }.}../*.
f2d0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
f2e0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
f2f0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
f300: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
f310: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
f320: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
f330: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
f340: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
f350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f360: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
f370: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
f380: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
f390: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
f3a0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
f3b0: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
f3c0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
f3d0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
f3e0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
f3f0: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
f400: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
f410: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
f420: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
f430: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
f440: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
f450: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
f460: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
f470: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
f480: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
f490: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
f4a0: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
f4b0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
f4c0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
f4d0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
f4e0: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
f4f0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
f500: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
f510: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
f520: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
f530: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
f540: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
f550: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
f560: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
f570: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
f580: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f590: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
f5a0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
f5b0: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
f5c0: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
f5d0: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
f5e0: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
f5f0: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
f600: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
f610: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
f620: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
f630: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
f640: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
f650: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
f660: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f670: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
f680: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
f690: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
f6a0: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
f6b0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
f6c0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
f6d0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
f6e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
f6f0: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
f700: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
f710: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
f720: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
f730: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
f740: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
f750: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
f760: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
f770: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
f780: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
f790: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
f7a0: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
f7b0: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
f7c0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
f7d0: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
f7e0: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
f7f0: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
f800: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
f810: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
f820: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
f830: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
f840: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
f850: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
f860: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
f870: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
f880: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
f890: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
f8a0: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
f8b0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
f8c0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
f8d0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
f8e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f8f0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
f900: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
f910: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
f920: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
f930: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
f940: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
f950: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
f960: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
f970: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
f980: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
f990: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
f9a0: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
f9b0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
f9c0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
f9d0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
f9e0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
f9f0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
fa00: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
fa10: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
fa20: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
fa30: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
fa40: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
fa50: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
fa60: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
fa70: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
fa80: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
fa90: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
faa0: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
fab0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
fac0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
fad0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
fae0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
faf0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
fb00: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
fb10: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
fb20: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
fb30: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
fb40: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
fb50: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
fb60: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
fb70: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
fb80: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
fb90: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
fba0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
fbb0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
fbc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
fbd0: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
fbe0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
fbf0: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
fc00: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
fc10: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
fc20: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
fc30: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
fc40: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
fc50: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
fc60: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
fc70: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
fc80: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
fc90: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
fca0: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
fcb0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
fcc0: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
fcd0: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
fce0: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
fcf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
fd00: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
fd10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
fd20: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
fd30: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
fd40: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
fd50: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
fd60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
fd70: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
fd80: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
fd90: 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
fda0: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
fdb0: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
fdc0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
fdd0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
fde0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
fdf0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
fe00: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
fe10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
fe20: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
fe30: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
fe40: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fe60: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
fe70: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
fe80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
fe90: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
fea0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
feb0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fed0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
fee0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
fef0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
ff00: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
ff10: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
ff20: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
ff30: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
ff40: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
ff50: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
ff60: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
ff70: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
ff80: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
ff90: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
ffa0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
ffb0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
ffc0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
ffd0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
ffe0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
fff0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
10000 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
10010 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10020 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
10030 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10040 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
10050 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
10060 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
10070 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
10080 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
10090 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
100a0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
100b0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
100c0 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
100d0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
100e0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
100f0 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
10100 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
10110 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
10120 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
10130 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
10140 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
10150 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
10160 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
10170 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 61 73  athname+1);.  as
10180 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
10190 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
101a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c!=SQLITE_OK .  
101b0 20 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20   || (zMaster[0] 
101c0 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63  && !sqlite3OsAcc
101d0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
101e0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
101f0 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a  _EXISTS)) .  ){.
10200 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
10210 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10220 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
10230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
10240 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10250 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10260 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
10270 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a    zMaster = 0;..
10280 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
10290 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
102a0 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
102b0 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
102c0 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
102d0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
102e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
102f0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
10300 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
10310 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
10320 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
10330 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
10340 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
10350 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
10360 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
10370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10380 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
10390 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
103a0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
103b0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
103c0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
103d0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
103e0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
103f0 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
10400 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
10410 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
10420 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
10430 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
10440 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
10450 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
10460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
10470 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10480 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
10490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
104a0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
104b0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
104c0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
104d0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
104e0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
104f0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
10500 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
10510 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
10520 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
10530 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
10540 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
10550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
10560 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
10570 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
10580 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
10590 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
105a0 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
105b0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
105c0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
105d0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
105e0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
105f0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
10600 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
10620 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10630 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
10640 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
10650 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10660 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
10670 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
10680 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
10690 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
106a0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
106b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
106c0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
106d0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
106e0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
106f0 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
10700 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
10710 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
10720 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
10730 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
10740 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
10750 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
10760 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
10770 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
10780 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
10790 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
107a0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
107b0 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
107c0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
107d0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
107e0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
107f0 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
10800 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
10810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10820 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
10830 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
10840 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
10850 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10860 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
10870 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
10880 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
10890 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
108a0 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
108b0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
108c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
108d0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
108e0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
108f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
10900 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
10910 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
10920 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
10930 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
10940 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
10950 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
10960 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10970 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
10980 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
10990 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
109a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
109b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
109c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
109d0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
109e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
109f0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
10a00 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
10a10 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
10a20 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
10a30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
10a40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
10a50 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
10a60 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
10a70 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
10a80 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
10a90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10aa0 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  Off, 1);.      i
10ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
10ae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
10af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10b00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
10b10 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
10b20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10b30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10b40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10b50 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
10b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10b70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
10b80 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
10b90 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
10ba0 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
10bb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10bc0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
10bd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
10be0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
10bf0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
10c00 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
10c10 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
10c20 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
10c30 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
10c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
10c50 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
10c60 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
10c70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10c80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
10c90 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f  ster[0] ){.    /
10ca0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
10cb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10cc0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
10cd0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
10ce0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
10cf0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
10d00 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
10d10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
10d20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
10d30 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
10d40 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
10d50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
10d60 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
10d70 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
10d80 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
10d90 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
10da0 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
10db0 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
10dc0 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
10dd0 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
10de0 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
10df0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
10e00 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
10e10 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
10e20 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
10e30 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
10e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10e50 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
10e60 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10e70 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
10e80 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
10e90 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
10ea0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
10eb0 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
10ec0 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
10ed0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
10ee0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
10ef0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
10f00 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
10f10 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
10f20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
10f30 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
10f40 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
10f50 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
10f60 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
10f70 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
10f80 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
10f90 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
10fa0 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
10fb0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
10fc0 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
10fd0 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
10fe0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
10ff0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
11000 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
11010 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
11020 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
11030 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11040 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
11050 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11060 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
11070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11080 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
11090 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
110a0 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
110b0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
110c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
110d0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
110e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
110f0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11100 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11110 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
11120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11130 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
11140 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73    {.    i64 os_s
11150 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
11160 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11170 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f  Pager->jfd, &os_
11180 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  szJ);.    if( rc
11190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
111a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73  turn rc;.    ass
111b0 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a  ert( szJ==os_szJ
111c0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
111d0 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
111e0 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
111f0 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
11200 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
11210 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  journal.  ** pag
11220 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
11230 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
11240 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68  al-header for th
11250 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
11260 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
11270 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68  s written, or th
11280 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
11290 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
112a0 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
112b0 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
112c0 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
112d0 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
112e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
112f0 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
11300 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
11310 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
11320 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
11330 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
11340 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
11350 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
11360 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
11370 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
11380 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11390 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73  >stmtSize);.  as
113a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
113b0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
113c0 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  D );..  /* Figur
113d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
113e0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
113f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11400 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
11410 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
11420 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
11430 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
11440 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
11450 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
11460 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
11470 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
11480 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11490 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
114a0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
114b0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
114c0 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
114d0 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
114e0 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
114f0 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
11500 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
11510 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
11520 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
11530 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
11540 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
11550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
11560 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  c; i++){.    i64
11570 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70   offset = i*(4+p
11580 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
11590 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
115a0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
115b0 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
115c0 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
115d0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
115e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
115f0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
11600 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11610 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11620 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
11630 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
11640 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
11650 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
11660 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
11670 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
11680 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
11690 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
116a0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
116b0 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
116c0 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
116d0 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
116e0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
116f0 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
11700 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
11710 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
11720 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
11730 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
11740 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
11750 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
11760 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
11770 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
11780 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
11790 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
117a0 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
117b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
117c0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50  ction..  */.  pP
117d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
117e0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
117f0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
11800 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
11810 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
11820 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
11830 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72  journalOff < hdr
11840 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Off ){.    rc = 
11850 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
11860 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
11870 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
11890 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
118a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
118b0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
118c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
118d0 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
118e0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
118f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11900 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
11910 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
11920 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11930 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
11940 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
11950 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
11960 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
11970 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
11980 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
11990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
119a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
119b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
119c0 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
119d0 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
119e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
119f0 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
11a00 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
11a10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11a20 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
11a30 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
11a40 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
11a50 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
11a60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11a70 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
11a80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11a90 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11aa0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11ab0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11ac0 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
11ad0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
11ae0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
11af0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11b00 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
11b10 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
11b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
11b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11b40 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
11b50 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
11b60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11b70 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
11b80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
11b90 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
11ba0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
11bb0 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
11bc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11bd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
11be0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
11bf0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
11c00 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
11c10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11c20 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
11c30 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
11c40 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
11c50 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
11c60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
11c70 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
11c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
11c90 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
11ca0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
11cb0 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
11cc0 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
11cd0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
11ce0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
11cf0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
11d00 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
11d10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
11d20 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
11d30 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
11d40 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
11d50 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
11d60 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
11d70 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
11d80 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
11d90 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
11da0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
11db0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11dc0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
11dd0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
11de0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
11df0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
11e00 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
11e10 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
11e20 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
11e30 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
11e40 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
11e50 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
11e60 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
11e70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11e80 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
11e90 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
11ea0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
11eb0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
11ec0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
11ed0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
11ee0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
11ef0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
11f10 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
11f20 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
11f30 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
11f40 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
11f50 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
11f60 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
11f70 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
11f80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11f90 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
11fa0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
11fb0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
11fc0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
11fd0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
11fe0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
11ff0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
12000 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12010 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
12020 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
12030 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
12040 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
12050 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
12060 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
12070 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
12090 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
120a0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
120b0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
120c0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
120d0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
120e0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
120f0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
12100 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
12110 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
12120 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
12130 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
12140 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
12150 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
12160 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
12170 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
12180 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
12190 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
121a0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
121b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
121c0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
121d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
121e0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
121f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12200 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
12210 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50  ull_fsync){.  pP
12220 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
12230 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
12240 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12250 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12260 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
12270 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12280 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
12290 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f 66  _flags = (full_f
122a0 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
122b0 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
122c0 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
122d0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
122e0 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
122f0 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
12300 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
12310 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
12320 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
12330 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
12340 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
12350 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
12360 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
12370 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
12380 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
12390 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
123a0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
123b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
123c0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
123d0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
123e0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
123f0 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
12400 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
12410 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
12420 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
12430 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
12440 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
12450 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
12460 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
12470 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
12480 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
12490 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
124a0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20  mporary.** file 
124b0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
124c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
124d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
124e0 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33  ntemp(.  sqlite3
124f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 2f  _vfs *pVfs,    /
12500 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
12510 6c 65 20 73 79 73 74 65 6d 20 6c 61 79 65 72 20  le system layer 
12520 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
12530 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
12540 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
12550 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
12560 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
12570 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
12580 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 4d 69  of the file.  Mi
12590 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
125a0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
125b0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
125c0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
125d0 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
125e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
125f0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
12600 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
12610 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
12620 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
12630 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
12640 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
12650 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
12660 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
12670 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
12680 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
12690 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
126a0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
126b0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
126c0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
126d0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
126e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
126f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c  sOpen(pVfs, zFil
12700 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76 66  ename, pFile, vf
12710 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
12720 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
12730 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d  _OK || pFile->pM
12740 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75  ethods );.  retu
12750 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12760 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
12770 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
12780 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
12790 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
127a0 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
127b0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
127c0 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
127d0 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
127e0 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
127f0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
12800 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
12810 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  rGet() and is on
12820 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
12830 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
12840 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
12850 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
12860 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  erUnref()..**.**
12870 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12880 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
12890 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
128a0 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
128b0 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
128c0 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
128d0 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
128e0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
128f0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
12900 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
12910 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
12920 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
12930 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
12940 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
12950 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
12960 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72  ..** It is never
12970 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
12980 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
12990 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
129a0 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79   an.** in-memory
129b0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
129c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
129d0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
129e0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
129f0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
12a00 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
12a10 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
12a20 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
12a30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
12a40 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
12a50 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
12a60 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
12a70 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
12a80 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
12a90 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
12aa0 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
12ab0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
12ac0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
12ad0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
12ae0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b00 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
12b10 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
12b20 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
12b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
12b40 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
12b50 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
12b60 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
12b70 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
12b80 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
12b90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12ba0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
12bb0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
12bc0 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
12bd0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
12be0 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
12bf0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
12c00 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
12c10 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
12c20 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
12c30 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
12c40 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
12c50 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
12c60 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a  eSize = sqlite3J
12c70 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
12c80 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c 74  ;.  int nDefault
12c90 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Page = SQLITE_DE
12ca0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
12cb0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
12cc0 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e  me;.  int nPathn
12cd0 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  ame;..  /* The d
12ce0 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73  efault return is
12cf0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
12d00 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
12d10 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
12d20 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
12d30 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e 61 6d  me */.  nPathnam
12d40 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
12d50 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74 68 6e  name+1;.  zPathn
12d60 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
12d70 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 29 3b  lloc(nPathname);
12d80 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
12d90 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12da0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12db0 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
12dc0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
12dd0 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
12de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
12df0 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
12e00 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
12e10 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
12e20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
12e30 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
12e40 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
12e50 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
12e60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e70 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
12e80 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
12e90 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
12ea0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hname);.    }.  
12eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
12ec0 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d 70  sqlite3OsGetTemp
12ed0 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50 61 74 68  name(pVfs, nPath
12ee0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
12ef0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
12f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12f10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
12f20 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
12f30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
12f40 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65  Pathname = strle
12f50 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20  n(zPathname);.. 
12f60 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
12f70 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65  ory for the page
12f80 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
12f90 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
12fa0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
12fb0 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
12fc0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
12fd0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
12fe0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
12ff0 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20  leSize +        
13000 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
13010 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  l file structure
13020 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73   */ .    pVfs->s
13030 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b 20 20 20  zOsFile * 2 +   
13040 20 20 20 20 20 2f 2a 20 54 68 65 20 64 62 20 61       /* The db a
13050 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  nd stmt journal 
13060 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 34 2a  files */ .    4*
13070 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20  nPathname + 40  
13080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
13090 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f  lename, zDirecto
130a0 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 53  ry, zJournal, zS
130b0 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a  tmtJrnl */.  );.
130c0 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b    if( !pPager ){
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 53 51 4c 49 54 45 5f    return SQLITE_
13100 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74  NOMEM;.  }.  pPt
13110 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65  r = (u8 *)&pPage
13120 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
13130 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
13140 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ags;.  pPager->f
13150 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
13160 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
13170 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50  zOsFile*0];.  pP
13180 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71  ager->stfd = (sq
13190 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
131a0 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
131b0 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  *1];.  pPager->j
131c0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
131d0 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
131e0 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70  szOsFile*2];.  p
131f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13200 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b   = (char*)&pPtr[
13210 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32  pVfs->szOsFile*2
13220 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  +journalFileSize
13230 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
13240 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
13250 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
13260 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
13270 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
13280 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
13290 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ory[nPathname+1]
132a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d  ;.  pPager->zStm
132b0 74 4a 72 6e 6c 20 3d 20 26 70 50 61 67 65 72 2d  tJrnl = &pPager-
132c0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
132d0 61 6d 65 2b 31 30 5d 3b 0a 20 20 70 50 61 67 65  ame+10];.  pPage
132e0 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
132f0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
13300 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
13310 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
13320 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  +1);.  sqlite3_f
13330 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13340 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
13350 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
13360 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
13370 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
13380 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  && !memDb ){.   
13390 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28   if( nPathname>(
133a0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
133b0 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72   - sizeof("-jour
133c0 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20  nal")) ){.      
133d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
133e0 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OPEN;.    }else{
133f0 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20  .      int fout 
13400 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
13410 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
13420 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
13430 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
13440 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
13450 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
13460 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66  er->vfsFlags, &f
13470 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64  out);.      read
13480 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
13490 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
134a0 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y);..      /* If
134b0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
134c0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
134d0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
134e0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a   access,.      *
134f0 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
13500 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
13510 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
13520 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20  create the.     
13530 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13540 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
13550 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
13560 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
13570 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
13580 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
13590 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
135a0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
135b0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
135c0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
135d0 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  Size().      ** 
135e0 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
135f0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
13600 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
13610 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20  tomically..     
13620 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
13630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
13640 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13650 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53      int iSectorS
13660 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
13670 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
13680 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
13690 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c  f( nDefaultPage<
136a0 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  iSectorSize ){. 
136b0 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c           nDefaul
136c0 74 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53  tPage = iSectorS
136d0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ize;.        }.#
136e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
136f0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
13700 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
13710 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
13720 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
13730 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
13740 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
13750 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
13760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
13770 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
13780 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
13790 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
137a0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
137b0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
137c0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
137d0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
137e0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
137f0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
13800 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e          for(ii=n
13810 44 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c  DefaultPage; ii<
13820 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
13830 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
13840 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
13850 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
13860 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
13870 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65  C|(ii>>8)) ) nDe
13880 66 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a  faultPage = ii;.
13890 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
138a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
138b0 20 20 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c       if( nDefaul
138c0 74 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58  tPage>SQLITE_MAX
138d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
138e0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
138f0 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53  nDefaultPage = S
13900 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
13910 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
13920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13930 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
13940 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f   !memDb ){.    /
13950 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
13960 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
13970 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
13980 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
13990 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
139a0 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
139b0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
139c0 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
139d0 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
139e0 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
139f0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
13a00 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
13a10 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ()..    */ .    
13a20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
13a30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
13a40 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
13a50 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  E;.  }..  if( pP
13a60 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49  ager && rc==SQLI
13a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
13a80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
13a90 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
13aa0 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61 75 6c 74  _malloc(nDefault
13ab0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
13ac0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
13ad0 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  ured in either o
13ae0 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
13af0 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68  ve..  ** Free th
13b00 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
13b10 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
13b20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65  file..  ** Since
13b30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
13b40 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72  t allocated ther
13b50 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
13b60 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61  set .  ** any Pa
13b70 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69  ger.errMask vari
13b80 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
13b90 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50  ( !pPager || !pP
13ba0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
13bb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
13bc0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
13bd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13be0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
13bf0 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51   return ((rc==SQ
13c00 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f  LITE_OK)?SQLITE_
13c10 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a  NOMEM:rc);.  }..
13c20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4f    PAGERTRACE3("O
13c30 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
13c40 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
13c50 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
13c60 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f  zFilename);.  IO
13c70 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
13c80 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
13c90 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13ca0 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ))..  /* Fill in
13cb0 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72   Pager.zDirector
13cc0 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  y[] */.  memcpy(
13cd0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
13ce0 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ry, pPager->zFil
13cf0 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
13d00 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72  +1);.  for(i=str
13d10 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  len(pPager->zDir
13d20 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26 26 20  ectory); i>0 && 
13d30 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
13d40 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
13d50 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
13d60 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
13d70 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20  ory[i-1] = 0;.. 
13d80 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65   /* Fill in Page
13d90 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 61 6e 64  r.zJournal[] and
13da0 20 50 61 67 65 72 2e 7a 53 74 6d 74 4a 72 6e 6c   Pager.zStmtJrnl
13db0 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  [] */.  memcpy(p
13dc0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
13dd0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13de0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
13df0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
13e00 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
13e10 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
13e20 22 2c 20 39 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ", 9);.  memcpy(
13e30 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
13e40 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  l, pPager->zFile
13e50 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
13e60 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67  ;.  memcpy(&pPag
13e70 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 5b 6e 50  er->zStmtJrnl[nP
13e80 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 73 74 6d 74  athname], "-stmt
13e90 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a 0a 20 20 2f  jrnl", 10);..  /
13ea0 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
13eb0 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  lOpen = 0; */.  
13ec0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
13ed0 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20  al = useJournal 
13ee0 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61  && !memDb;.  pPa
13ef0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
13f00 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20  = noReadlock && 
13f10 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
13f20 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
13f30 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
13f40 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
13f50 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
13f60 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
13f70 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
13f80 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
13f90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13fa0 3d 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 0a  = nDefaultPage;.
13fb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
13fc0 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
13fd0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
13fe0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
13ff0 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
14000 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14010 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
14020 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
14030 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
14040 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
14050 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
14060 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
14070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14080 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
14090 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
140a0 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
140b0 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70  NLOCK) );.  /* p
140c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
140d0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
140e0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
140f0 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
14100 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
14110 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
14120 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
14130 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
14140 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
14150 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
14160 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
14170 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
14180 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
14190 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
141a0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
141b0 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
141c0 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
141d0 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
141e0 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
141f0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
14200 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
14210 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
14220 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
14230 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
14240 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
14250 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
14260 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
14270 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
14280 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20  NC_NORMAL;.  /* 
14290 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
142a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
142b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
142c0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
142d0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
142e0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
142f0 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
14300 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
14310 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
14320 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d  >fd->pMethods||m
14330 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b  emDb||tempFile);
14340 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
14350 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69  .    setSectorSi
14360 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
14370 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
14380 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
14390 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  /.  /* memset(pP
143a0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
143b0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
143c0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70  Hash)); */.  *pp
143d0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
143e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
143f0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
14400 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d  GEMENT.  pPager-
14410 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
14420 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44   pPager->iInUseD
14430 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65  B = 0;.  if( !me
14440 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
14450 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20  e3_mutex *mutex 
14460 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
14470 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
14480 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
14490 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
144a0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
144b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  .    pPager->pNe
144c0 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  xt = sqlite3Page
144d0 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  rList;.    if( s
144e0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
144f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14500 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14510 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20  t->pPrev==0 );. 
14520 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14530 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  rList->pPrev = p
14540 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Pager;.    }.   
14550 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d   pPager->pPrev =
14560 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   0;.    sqlite3P
14570 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
14580 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  r;.    sqlite3_m
14590 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
145a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
145b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
145c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
145d0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
145e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
145f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
14600 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  tBusyhandler(Pag
14610 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
14620 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
14630 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
14640 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
14650 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
14660 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14670 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
14680 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
14690 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
146a0 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
146b0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
146c0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
146d0 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
146e0 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
146f0 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
14700 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
14710 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
14720 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
14730 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
14740 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
14750 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
14760 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
14770 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
14780 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20  e3PagerClose(). 
14790 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
147a0 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
147b0 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
147c0 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Unref()..*/.void
147d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
147e0 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  Destructor(Pager
147f0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
14800 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c  *xDesc)(DbPage*,
14810 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
14820 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
14830 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
14840 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
14850 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
14860 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
14870 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
14880 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
14890 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
148a0 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
148b0 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
148c0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
148d0 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
148e0 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
148f0 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
14900 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
14910 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
14920 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
14930 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
14940 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
14950 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
14960 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
14970 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
14980 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
14990 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
149a0 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
149b0 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  t)(DbPage*,int))
149c0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
149d0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
149e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
149f0 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a  e page size to *
14a00 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68  pPageSize. If th
14a10 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61  e suggest new pa
14a20 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e  ge size is.** in
14a30 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65  appropriate, the
14a40 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  n an alternative
14a50 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
14a60 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
14a70 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
14a80 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
14a90 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
14aa0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
14ab0 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a  r, u16 *pPageSiz
14ac0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
14ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20  QLITE_OK;.  u16 
14ae0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
14af0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
14b00 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
14b10 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
14b20 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
14b30 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14b40 29 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  ) );.  if( pageS
14b50 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
14b60 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
14b70 65 20 0a 20 20 20 26 26 20 21 70 50 61 67 65 72  e .   && !pPager
14b80 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
14b90 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29 7b  r->nRef==0 .  ){
14ba0 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
14bb0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
14bc0 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  3_malloc(pageSiz
14bd0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65  e);.    if( !pNe
14be0 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
14bf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14c10 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
14c20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  );.      pager_r
14c30 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
14c40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
14c50 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
14c60 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72  .      setSector
14c70 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
14c80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14c90 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
14ca0 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
14cb0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
14cc0 4e 65 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72  New;.      pager
14cd0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
14ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67     }.  }.  *pPag
14cf0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
14d00 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  pageSize;.  retu
14d10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14d20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
14d30 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
14d40 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
14d50 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
14d60 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
14d70 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
14d80 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
14d90 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
14da0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
14db0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
14dc0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
14dd0 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
14de0 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
14df0 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
14e00 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
14e10 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
14e20 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
14e30 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
14e40 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
14e50 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
14e60 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
14e70 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
14e80 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
14e90 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
14ea0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
14eb0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14ec0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
14ee0 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
14ef0 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
14f00 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
14f10 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
14f20 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
14f30 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
14f40 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
14f50 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
14f60 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
14f70 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
14f80 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
14f90 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
14fa0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
14fb0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
14fc0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
14fd0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
14fe0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
14ff0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
15000 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
15010 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
15020 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
15030 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
15040 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
15050 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
15060 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
15070 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  t(pPager);.  ret
15080 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
15090 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
150a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
150b0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
150c0 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
150d0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
150e0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
150f0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
15100 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
15110 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
15120 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
15130 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
15140 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
15150 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
15160 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
15170 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
15180 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
15190 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
151a0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
151b0 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
151c0 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
151d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
151e0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
151f0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
15200 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
15210 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
15220 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
15230 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
15240 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
15250 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
15260 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
15270 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
15280 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
15290 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
152a0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
152b0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
152c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
152d0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
152e0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
152f0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
15300 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
15310 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
15320 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
15330 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
15340 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
15350 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
15360 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
15370 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
15380 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
15390 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
153a0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
153b0 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
153c0 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
153d0 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
153e0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
153f0 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
15400 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
15410 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
15420 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
15430 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
15440 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
15450 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
15460 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
15470 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
15480 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
15490 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
154a0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
154b0 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
154c0 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
154d0 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
154e0 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
154f0 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
15500 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
15510 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
15520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
15530 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
15540 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
15550 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
15560 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
15570 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15580 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
15590 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
155a0 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67  sert(MEMDB||pPag
155b0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
155c0 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
155d0 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  le);.  if( pPage
155e0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
155f0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
15600 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
15610 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
15620 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15630 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
15640 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
15650 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15660 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
15670 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
15680 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
15690 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
156a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
156b0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
156c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
156d0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
156e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
156f0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
15700 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
15710 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
15720 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
15730 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
15740 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
15750 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
15760 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
15770 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
15780 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
15790 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
157a0 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
157b0 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
157c0 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
157d0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
157e0 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
157f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
15800 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
15810 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
15820 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
15830 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d  ager){.  i64 n =
15840 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
15850 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
15860 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
15870 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
15880 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
158a0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
158b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
158c0 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
158d0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
158e0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
158f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
15900 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65  ;.    if( (pPage
15910 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29  r->fd->pMethods)
15920 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73  .     && (rc = s
15930 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
15940 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
15950 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
15960 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
15970 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67 65  ef++;.      page
15980 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
15990 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rc);.      pPage
159a0 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  r->nRef--;.     
159b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
159c0 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
159d0 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
159e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
159f0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
15a00 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
15a10 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
15a20 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15a30 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
15a40 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
15a50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
15a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15a70 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
15a80 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
15a90 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
15aa0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
15ab0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
15ac0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
15ad0 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
15ae0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
15af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
15b00 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
15b10 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
15b20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
15b30 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
15b40 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
15b50 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st){.  sqlite3_f
15b60 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
15b70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
15b80 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
15b90 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
15ba0 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
15bb0 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
15bc0 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
15bd0 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
15be0 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
15bf0 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
15c00 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
15c10 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
15c20 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
15c30 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
15c40 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
15c50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
15c60 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
15c70 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
15c80 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
15c90 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
15ca0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
15cb0 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
15cc0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
15cd0 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
15ce0 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
15cf0 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
15d00 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
15d10 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
15d20 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
15d30 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
15d40 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
15d50 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
15d60 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
15d70 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
15d80 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  gno==0 ){.    as
15d90 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
15da0 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
15db0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
15dc0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15dd0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
15de0 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
15df0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
15e00 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
15e10 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
15e20 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
15e30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15e40 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50  pPager->aHash[pP
15e50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
15e60 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50  r->nHash-1)]!=pP
15e70 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
15e80 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
15e90 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
15ea0 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
15eb0 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70    int h = pPg->p
15ec0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
15ed0 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61  Hash-1);.    pPa
15ee0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
15ef0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
15f00 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
15f10 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74  ){.    clearHist
15f20 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
15f30 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
15f40 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  .  }.  pPg->pgno
15f50 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
15f60 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
15f70 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
15f80 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
15f90 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
15fa0 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
15fb0 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
15fc0 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
15fd0 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
15fe0 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
15ff0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
16000 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
16010 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
16020 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
16030 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55  >pPager;..  /* U
16040 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20  nlink from free 
16050 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c  page list */.  l
16060 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
16070 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  );..  /* Unlink 
16080 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
16090 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
160a0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
160b0 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
160c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
160d0 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
160e0 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
160f0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
16100 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
16110 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
16120 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
16130 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
16140 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
16150 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
16160 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
16170 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
16180 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
16190 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
161a0 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
161b0 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
161c0 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
161d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
161e0 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
161f0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
16200 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
16210 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
16220 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
16230 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
16240 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
16250 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
16260 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
16270 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
16280 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
16290 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
162a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
162b0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
162c0 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
162d0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
162e0 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
162f0 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
16300 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
16310 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
16320 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
16330 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
16340 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
16350 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
16360 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
16370 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
16380 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
16390 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
163a0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
163b0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
163c0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
163d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
163e0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
163f0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
16400 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
16410 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
16420 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
16430 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
16440 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
16450 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
16460 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
16470 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
16480 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
16490 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
164a0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
164b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
164c0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
164d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
164e0 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
164f0 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
16500 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16510 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
16520 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
16530 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
16540 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
16550 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
16560 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
16570 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
16580 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
16590 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
165a0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
165b0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
165c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
165d0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
165e0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
165f0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
16600 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
16610 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
16620 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
16630 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
16640 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
16650 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
16660 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
16670 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
16680 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
16690 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
166a0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
166b0 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
166c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
166d0 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
166e0 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
166f0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16700 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
16710 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
16720 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
16730 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
16740 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
16750 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
16760 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
16770 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16780 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
16790 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
167a0 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
167b0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
167c0 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
167d0 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
167e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
167f0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
16800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16810 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
16820 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
16830 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
16840 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
16850 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
16860 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
16870 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
16880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
168a0 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
168b0 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
168c0 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
168d0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
168e0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
168f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16900 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
16910 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
16920 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16930 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
16940 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
16950 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
16960 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
16970 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
16980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16990 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
169a0 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
169b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
169c0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
169d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
169e0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
169f0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
16a00 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
16a10 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
16a20 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
16a30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
16a40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16a50 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16a60 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
16a70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
16a80 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
16a90 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
16aa0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
16ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16ac0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
16ad0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 79  ager);.  rc = sy
16ae0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
16af0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
16b00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
16b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16b20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16b30 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
16b40 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
16b50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
16b60 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
16b70 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e 74 65  . */.  pagerEnte
16b80 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
16b90 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16ba0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
16bb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16bc0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
16bd0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
16be0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16bf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16c00 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
16c10 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
16c20 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
16c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
16c40 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
16c50 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
16c60 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
16c70 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
16c80 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
16c90 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
16ca0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
16cb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
16cc0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
16cd0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16ce0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
16cf0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
16d00 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
16d10 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
16d20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
16d30 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
16d40 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
16d50 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
16d60 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
16d70 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
16d80 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
16d90 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
16da0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
16db0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
16dc0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
16dd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
16de0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
16df0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
16e00 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
16e10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
16e20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
16e30 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
16e40 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
16e50 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
16e60 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
16e70 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
16e80 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
16e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
16ea0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
16eb0 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
16ec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
16ed0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
16ee0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
16ef0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
16f00 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
16f10 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
16f20 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
16f30 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c  C_MEM2);.    sql
16f40 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16f50 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  (mutex);.    if(
16f60 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 29   pPager->pPrev )
16f70 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
16f80 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
16f90 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
16fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
16fb0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
16fc0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
16fd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16fe0 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b 0a  Pager->pNext ){.
16ff0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e        pPager->pN
17000 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ext->pPrev = pPa
17010 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ger->pPrev;.    
17020 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  }.    sqlite3_mu
17030 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
17040 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17050 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
17060 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
17070 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17080 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17090 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
170a0 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
170b0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
170c0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
170d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
170e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
170f0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
17100 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
17110 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
17120 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
17130 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
17140 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
17150 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
17160 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
17170 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
17180 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
17190 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
171a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
171b0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
171c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
171d0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
171e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
171f0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
17200 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
17210 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
17220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
17230 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
17240 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
17250 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
17260 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
17270 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
17280 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
17290 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
172a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
172b0 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
172c0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
172d0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
172e0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
172f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
17300 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
17310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17320 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17330 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
17340 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
17350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17360 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
17370 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
17380 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
17390 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
173a0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
173b0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
173c0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
173d0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
173e0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
173f0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
17400 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17410 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
17420 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
17430 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
17440 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
17450 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
17460 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
17470 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
17480 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
17490 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
174a0 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
174b0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
174c0 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
174d0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
174e0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
174f0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
17500 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
17510 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
17520 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
17530 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
17540 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
17550 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
17560 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
17570 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
17580 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
17590 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
175a0 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
175b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
175c0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
175d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
175e0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
175f0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
17600 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
17610 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
17620 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
17630 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
17640 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
17650 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
17660 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
17670 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
17680 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
17690 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
176a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
176b0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
176c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
176d0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
176e0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
176f0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
17700 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
17710 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
17720 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
17730 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17740 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
17750 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
17760 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
17770 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
17780 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17790 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
177a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
177b0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
177c0 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
177d0 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
177e0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
177f0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
17800 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
17810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17820 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
17830 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
17840 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
17850 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
17860 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
17870 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
17880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
17890 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
178a0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
178b0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
178c0 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
178d0 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
178e0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
178f0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
17900 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
17910 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
17920 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
17930 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
17940 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
17950 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
17960 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
17970 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
17980 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
17990 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
179a0 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
179b0 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
179c0 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
179d0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
179e0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
179f0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
17a00 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
17a10 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
17a20 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
17a30 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
17a40 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
17a50 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
17a60 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
17a70 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
17a80 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
17a90 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
17aa0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
17ab0 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
17ac0 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
17ad0 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
17ae0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
17af0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
17b00 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
17b10 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17b20 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
17b30 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
17b40 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
17b50 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
17b60 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
17b70 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
17b80 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
17b90 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
17ba0 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
17bb0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
17bc0 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
17bd0 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
17be0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
17bf0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
17c00 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
17c10 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
17c20 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
17c30 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
17c40 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
17c50 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
17c60 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
17c70 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
17c80 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
17c90 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
17ca0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
17cb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17cc0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
17cd0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
17ce0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
17cf0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
17d00 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
17d10 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
17d20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17d30 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
17d40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17d50 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
17d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
17d70 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
17d80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
17d90 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
17da0 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
17db0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
17dc0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
17dd0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
17de0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
17df0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
17e00 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
17e10 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
17e20 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
17e30 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
17e40 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
17e50 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17e60 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
17e70 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
17e80 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
17e90 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
17ea0 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
17eb0 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
17ec0 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
17ed0 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
17ee0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
17ef0 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
17f00 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17f10 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
17f20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
17f30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
17f40 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
17f50 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
17f60 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
17f70 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
17f80 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
17f90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
17fa0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17fb0 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
17fc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17fd0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
17fe0 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
17ff0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18000 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
18010 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18030 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
18040 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
18050 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18060 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
18070 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
18080 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
18090 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
180a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
180b0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
180c0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
180d0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
180e0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
180f0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
18100 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
18110 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
18120 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
18130 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
18140 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
18150 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
18160 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
18170 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
18180 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
18190 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
181a0 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
181b0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
181c0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
181d0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
181e0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
181f0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
18200 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
18210 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
18220 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
18230 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
18240 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
18250 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
18260 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
18270 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
18280 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
18290 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
182a0 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
182b0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
182c0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
182d0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
182e0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
182f0 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
18300 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
18310 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
18320 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
18330 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
18340 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18350 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18360 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18370 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18380 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
18390 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
183a0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
183b0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
183c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
183d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
183e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
183f0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
18400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
18410 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
18420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18430 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
18440 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
18450 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
18460 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
18470 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
18480 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
18490 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
184a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
184b0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
184c0 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
184d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
184e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
184f0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18500 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
18510 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
18520 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
18530 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
18540 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18550 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
18560 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
18570 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18580 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18590 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
185a0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
185b0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
185c0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
185d0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
185e0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
185f0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
18600 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
18610 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
18620 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18630 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18640 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
18650 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
18660 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18670 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
18680 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
18690 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
186a0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
186b0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
186c0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
186d0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
186e0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
186f0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
18700 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69      lruListSetFi
18710 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
18720 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18730 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
18740 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
18750 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
18760 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
18770 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
18780 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
18790 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
187a0 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
187b0 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
187c0 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
187d0 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
187e0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
187f0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
18800 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
18810 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
18820 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
18830 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18840 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
18850 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
18860 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
18870 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18890 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
188a0 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
188b0 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
188c0 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
188d0 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
188e0 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
188f0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
18900 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
18910 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
18920 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
18930 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
18940 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
18950 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
18960 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
18970 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
18980 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
18990 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
189a0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
189b0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
189c0 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
189d0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
189e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
189f0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18a00 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
18a10 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
18a20 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
18a30 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
18a40 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18a50 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
18a60 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
18a70 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
18a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
18a90 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
18aa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
18ab0 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
18ac0 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
18ad0 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
18ae0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
18af0 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
18b00 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
18b10 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
18b20 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
18b30 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
18b40 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
18b50 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
18b60 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
18b70 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
18b80 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18b90 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
18ba0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18bb0 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
18bc0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18bd0 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
18be0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
18bf0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
18c00 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
18c10 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
18c20 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
18c30 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18c40 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
18c50 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
18c60 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
18c70 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
18c80 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
18c90 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
18ca0 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
18cb0 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
18cc0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
18cd0 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
18ce0 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
18cf0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
18d00 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
18d10 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
18d20 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
18d30 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
18d40 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
18d50 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
18d60 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
18d70 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
18d80 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
18d90 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
18da0 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
18db0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
18dc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
18dd0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
18de0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
18df0 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
18e00 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
18e10 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
18e20 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
18e30 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
18e40 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
18e50 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
18e60 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
18e70 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
18e80 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
18e90 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
18ea0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
18eb0 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
18ec0 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
18ed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
18ee0 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
18ef0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
18f00 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
18f10 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
18f20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
18f30 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
18f40 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
18f50 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
18f60 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
18f70 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
18f80 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
18f90 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
18fa0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
18fb0 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
18fc0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
18fd0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
18fe0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
18ff0 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
19000 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
19010 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
19020 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
19030 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
19040 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67  er *pPager;.  Pg
19050 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  Hdr *p;.  int rc
19060 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
19070 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19080 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
19090 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
190a0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
190b0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
190c0 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
190d0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
190e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
190f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19100 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
19110 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
19120 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
19130 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
19140 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
19150 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
19160 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
19170 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
19180 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
19190 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
191a0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
191b0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
191c0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
191d0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
191e0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
191f0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
19200 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
19210 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
19220 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
19230 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
19240 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
19250 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
19260 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
19270 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
19280 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
19290 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
192a0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
192b0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
192c0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
192d0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
192e0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
192f0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
19300 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
19310 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
19320 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
19330 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
19340 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
19350 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
19360 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
19370 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
19380 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
19390 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
193a0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
193b0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
193c0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
193d0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
193e0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
193f0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
19400 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
19410 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
19420 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
19430 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
19440 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
19450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19470 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
19480 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
19490 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
194a0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
194b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
194c0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d  >dirty );.    p-
194d0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
194e0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
194f0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
19500 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
19510 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
19520 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
19530 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19540 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
19550 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
19560 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
19570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19580 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
19590 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
195a0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
195b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
195e0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
195f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
19600 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19610 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19620 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
19630 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
19640 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
19650 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
19660 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
19670 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
19680 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
19690 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
196a0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
196b0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
196c0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
196d0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
196e0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
196f0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
19700 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
19710 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19720 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
19730 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
19740 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
19750 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
19760 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
19770 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19780 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
19790 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
197a0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
197b0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
197c0 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
197d0 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
197e0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
197f0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
19810 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19820 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
19830 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19840 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
19850 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
19860 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
19870 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
19880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19890 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
198a0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
198b0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
198c0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
198d0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
198e0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
198f0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
19900 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
19910 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
19920 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
19930 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
19940 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
19950 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
19960 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19970 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19980 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
19990 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
199a0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
199b0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
199c0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", 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 29 3b 0a 20 20 20  List->pgno);.   
199f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
19a00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19a10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19a20 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19a30 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
19a40 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
19a50 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
19a60 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
19a70 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
19a80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
19aa0 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
19ab0 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
19ac0 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
19ad0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19ae0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
19af0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
19b00 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
19b10 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
19b20 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
19b30 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
19b40 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
19b50 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
19b60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19b70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19b80 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
19b90 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19ba0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
19bb0 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
19bc0 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
19bd0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
19be0 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
19bf0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
19c00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
19c10 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
19c20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19c30 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
19c40 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
19c50 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
19c60 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
19c70 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
19c80 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
19c90 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
19ca0 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
19cb0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
19cc0 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
19cd0 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
19ce0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19cf0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19d00 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19d10 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
19d20 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
19d30 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
19d40 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
19d50 74 68 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30  thods ) return 0
19d60 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
19d70 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
19d80 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
19d90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
19da0 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 72 65  XISTS) ){.    re
19db0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
19dc0 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
19dd0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
19de0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
19df0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19e00 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
19e10 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
19e20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
19e30 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
19e40 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
19e50 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  al, 0);.    retu
19e60 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
19e70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
19e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
19e90 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
19ea0 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
19eb0 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
19ec0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19ed0 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
19ee0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
19ef0 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
19f00 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
19f10 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
19f20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
19f30 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
19f40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
19f50 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
19f60 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
19f70 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
19f80 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
19f90 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
19fa0 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  l to call this f
19fb0 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
19fc0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a  he pager object.
19fd0 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
19fe0 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61 74  by pPager has at
19ff0 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20   least one free 
1a000 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68 20  page (page with 
1a010 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a  nRef==0)..  */ .
1a020 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
1a030 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
1a040 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1a050 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
1a060 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
1a070 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
1a080 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
1a090 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
1a0a0 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
1a0b0 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
1a0c0 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
1a0d0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a0e0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
1a0f0 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
1a100 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
1a110 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1a120 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
1a130 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
1a140 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
1a150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a160 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
1a170 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
1a180 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
1a190 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
1a1a0 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
1a1b0 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
1a1c0 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
1a1d0 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
1a1e0 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  & pPager->lru.pF
1a1f0 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  irst){.    int i
1a200 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1a210 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a220 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1a230 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
1a240 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1a250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1a260 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a270 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1a280 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1a290 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1a2a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1a2b0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1a2c0 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
1a2d0 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
1a2e0 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
1a2f0 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
1a300 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1a310 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
1a320 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
1a330 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
1a340 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
1a350 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
1a360 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
1a370 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
1a380 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
1a390 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
1a3a0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
1a3b0 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
1a3c0 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
1a3d0 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
1a3e0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
1a3f0 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
1a400 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
1a410 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1a420 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a440 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
1a450 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1a460 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1a470 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1a480 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a4a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1a4b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a4c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
1a4d0 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1a4e0 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  rst;.  }..  asse
1a4f0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
1a500 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1a510 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
1a520 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
1a530 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
1a540 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
1a550 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
1a560 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1a570 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
1a580 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
1a590 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
1a5a0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1a5b0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1a5c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1a5d0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
1a5e0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  Pg );.    pPg->d
1a5f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1a600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a610 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a620 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
1a630 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1a640 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
1a650 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
1a660 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
1a670 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
1a680 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
1a690 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61  ** set the globa
1a6a0 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  l alwaysRollback
1a6b0 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61   flag, thus disa
1a6c0 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  bling the.  ** s
1a6d0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1a6e0 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69  ollback() optimi
1a6f0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  zation for the r
1a700 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  est of this tran
1a710 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74  saction..  ** It
1a720 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1a730 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65   do this because
1a740 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64   the page marked
1a750 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
1a760 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65    ** might be re
1a770 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65  loaded at a late
1a780 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68  r time but at th
1a790 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27  at point we won'
1a7a0 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  t remember.  ** 
1a7b0 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
1a7c0 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
1a7d0 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
1a7e0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
1a7f0 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  st.  ** be marke
1a800 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1a810 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e  ack from here on
1a820 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   out..  */.  if(
1a830 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1a840 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52  back ){.    IOTR
1a850 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c  ACE(("ALWAYS_ROL
1a860 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  LBACK %p\n", pPa
1a870 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72  ger)).    pPager
1a880 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1a890 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
1a8a0 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
1a8b0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
1a8c0 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
1a8d0 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ash table.  */. 
1a8e0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
1a8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a900 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a  >pgno==0 );..  *
1a910 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65  ppPg = pPg;.  re
1a920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a930 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1a940 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1a950 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20  ANAGEMENT./*.** 
1a960 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a970 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20   called to free 
1a980 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61  superfluous dyna
1a990 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
1a9a0 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64  d memory.** held
1a9b0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79   by the pager sy
1a9c0 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20  stem. Memory in 
1a9d0 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74  use by any SQLit
1a9e0 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65  e pager allocate
1a9f0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72  d.** by the curr
1aa00 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62  ent thread may b
1aa10 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  e sqlite3_free()
1aa20 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
1aa30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1aa40 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
1aa50 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
1aa60 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
1aa70 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
1aa80 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
1aa90 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20  rns. The return 
1aaa0 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
1aab0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
1aac0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1aad0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e   released..*/.in
1aae0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1aaf0 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20  leaseMemory(int 
1ab00 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nReq){.  int nRe
1ab10 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20  leased = 0;     
1ab20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1ab30 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
1ab40 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71 6c   so far */.  sql
1ab50 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1ab60 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
1ab70 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
1ab80 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1aba0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1abb0 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79  pagers */.  Busy
1abc0 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75  Handler *savedBu
1abd0 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64  sy;     /* Saved
1abe0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73   copy of the bus
1abf0 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  y handler */.  i
1ac00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ac10 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65  K;..  /* Acquire
1ac20 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61   the memory-mana
1ac30 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a  gement mutex.  *
1ac40 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69  /.  mutex = sqli
1ac50 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1ac60 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1ac70 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71 6c  TIC_MEM2);.  sql
1ac80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1ac90 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  (mutex);..  /* S
1aca0 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62 61  ignal all databa
1acb0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1acc0 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67  hat memory manag
1acd0 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a  ement wants.  **
1ace0 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 20   to have access 
1acf0 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a 20  to the pagers.. 
1ad00 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72   */.  for(pPager
1ad10 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73  =sqlite3PagerLis
1ad20 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65  t; pPager; pPage
1ad30 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
1ad40 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  {.     pPager->i
1ad50 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d  InUseMM = 1;.  }
1ad60 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1ad70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65  QLITE_OK && (nRe
1ad80 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
1ad90 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50 67  <nReq) ){.    Pg
1ada0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50 67  Hdr *pPg;.    Pg
1adb0 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a  Hdr *pRecycled;.
1adc0 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20   .    /* Try to 
1add0 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  find a page to r
1ade0 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65 73  ecycle that does
1adf0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 73   not require a s
1ae00 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ync(). If.    **
1ae10 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73   this is not pos
1ae20 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20  sible, find one 
1ae30 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69 72  that does requir
1ae40 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20 20  e a sync()..    
1ae50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  */.    sqlite3_m
1ae60 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1ae70 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1ae80 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1ae90 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50  IC_LRU));.    pP
1aea0 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
1aeb0 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e  geList.pFirstSyn
1aec0 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ced;.    while( 
1aed0 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65  pPg && (pPg->nee
1aee0 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50  dSync || pPg->pP
1aef0 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20  ager->iInUseDB) 
1af00 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  ){.      pPg = p
1af10 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1af20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
1af30 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67  pPg ){.      pPg
1af40 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1af50 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20  eList.pFirst;.  
1af60 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1af70 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69  & pPg->pPager->i
1af80 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20  InUseDB ){.     
1af90 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1afa0 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ree.pNext;.     
1afb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1afc0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1afd0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
1afe0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1aff0 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1b000 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d  .    /* If pPg==
1b010 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63  0, then the bloc
1b020 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c  k above has fail
1b030 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ed to find a pag
1b040 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79  e to.    ** recy
1b050 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  cle. In this cas
1b060 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d  e return early -
1b070 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f   no further memo
1b080 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ry will.    ** b
1b090 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
1b0a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 20  */.    if( !pPg 
1b0b0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50  ) break;..    pP
1b0c0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1b0d0 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21  er;.    assert(!
1b0e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1b0f0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1b100 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61  u.pFirst);.    a
1b110 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53  ssert(pPg->needS
1b120 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1b130 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1b140 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61  nced);.  .    sa
1b150 76 65 64 42 75 73 79 20 3d 20 70 50 61 67 65 72  vedBusy = pPager
1b160 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->pBusyHandler;.
1b170 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1b180 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20  yHandler = 0;.  
1b190 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1b1a0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52  ycle(pPager, &pR
1b1b0 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50  ecycled);.    pP
1b1c0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1b1d0 65 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a  er = savedBusy;.
1b1e0 20 20 20 20 61 73 73 65 72 74 28 70 52 65 63 79      assert(pRecy
1b1f0 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21  cled==pPg || rc!
1b200 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20  =SQLITE_OK);.   
1b210 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b220 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  OK ){.      /* W
1b230 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67  e've found a pag
1b240 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68  e to free. At th
1b250 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67  is point the pag
1b260 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20  e has been .    
1b270 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f    ** removed fro
1b280 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d  m the page hash-
1b290 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74  table, free-list
1b2a0 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74   and synced-list
1b2b0 20 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72   .      ** (pFir
1b2c0 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73  stSynced). It is
1b2d0 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c   still in the al
1b2e0 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c  l pages (pAll) l
1b2f0 69 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52  ist. .      ** R
1b300 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
1b310 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66  is list before f
1b320 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a  reeing..      **
1b330 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20  .      ** Todo: 
1b340 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
1b350 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
1b360 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
1b370 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a  Ok. It .      **
1b380 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f   probably is tho
1b390 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
1b3a0 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b      PgHdr *pTmp;
1b3b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b3c0 50 67 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg );.      if( 
1b3d0 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pPg==pPager->pAl
1b3e0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50  l ){.         pP
1b3f0 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
1b400 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
1b410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b420 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65   for( pTmp=pPage
1b430 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70  r->pAll; pTmp->p
1b440 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54  NextAll!=pPg; pT
1b450 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  mp=pTmp->pNextAl
1b460 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 54  l ){}.        pT
1b470 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  mp->pNextAll = p
1b480 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
1b490 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c      }.      nRel
1b4a0 65 61 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20  eased += (.     
1b4b0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67       sizeof(*pPg
1b4c0 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
1b4d0 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 2b  Size.          +
1b4e0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1b4f0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1b500 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1b510 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1b520 29 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ) .      );.    
1b530 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
1b540 45 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70  EE %p %d *\n", p
1b550 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1b560 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
1b570 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1b580 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
1b590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1b5a0 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  free(pPg->pData)
1b5b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1b5c0 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1b5d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
1b5e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b5f0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
1b600 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
1b610 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
1b620 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
1b630 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1b640 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
1b650 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
1b660 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
1b670 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
1b680 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
1b690 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
1b6a0 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
1b6b0 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
1b6c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72  .      ** The er
1b6d0 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
1b6e0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
1b6f0 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
1b700 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 2a  he case .      *
1b710 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
1b720 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
1b730 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
1b740 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
1b750 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
1b760 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
1b770 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29 3d        (rc&0xff)=
1b780 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
1b790 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
1b7a0 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
1b7b0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1b7c0 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29 3b  TE_BUSY.      );
1b7d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b7e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1b7f0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1b800 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
1b810 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1b820 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1b830 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20  lear the memory 
1b840 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73  management flags
1b850 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1b860 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f   mutex.  */.  fo
1b870 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33  r(pPager=sqlite3
1b880 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65  PagerList; pPage
1b890 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72  r; pPager=pPager
1b8a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70  ->pNext){.     p
1b8b0 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
1b8c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1b8d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
1b8e0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  utex);..  /* Ret
1b8f0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1b900 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65 64  f bytes released
1b910 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  .  */.  return n
1b920 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
1b930 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1b940 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1b950 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
1b960 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1b970 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74   of page pPg out
1b980 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b990 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1b9a0 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1b9b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1b9c0 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20  gHdr *pPg, Pgno 
1b9d0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pgno){.  int rc;
1b9e0 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20  .  i64 offset;. 
1b9f0 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
1ba00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  0 );.  assert(pP
1ba10 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1ba20 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
1ba30 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50  File);.  if( !pP
1ba40 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1ba50 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ds ){.    return
1ba60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1ba70 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  ORT_READ;.  }.  
1ba80 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1ba90 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1baa0 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
1bab0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1bac0 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
1bad0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1bae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1baf0 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
1bb00 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1bb10 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1bb20 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1bb30 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1bb40 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1bb50 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1bb60 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
1bb70 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1bb80 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1bb90 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
1bba0 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  8*)PGHDR_TO_DATA
1bbb0 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20  (pPg))[24],.    
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1bbf0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1bc00 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44  ers));.  }.  COD
1bc10 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC1(pPager, PGHD
1bc20 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1bc30 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
1bc40 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45   PAGERTRACE4("FE
1bc50 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1bc60 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1bc80 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1bc90 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
1bca0 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
1bcb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1bcc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1bcd0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1bce0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
1bcf0 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
1bd00 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
1bd10 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
1bd20 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1bd30 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
1bd40 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
1bd50 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
1bd60 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1bd70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1bd80 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
1bd90 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
1bda0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
1bdb0 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
1bdc0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
1bdd0 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
1bde0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
1bdf0 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
1be00 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
1be10 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
1be20 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
1be30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1be40 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1be50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1be60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1be70 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f  E_OK;.  int isHo
1be80 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
1be90 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
1bea0 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c   opened for excl
1beb0 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68 61  usive access, ha
1bec0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1bed0 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65   .  ** page refe
1bee0 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e  rences and is in
1bef0 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   an error-state,
1bf00 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61 6e   now is the chan
1bf10 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
1bf20 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
1bf30 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
1bf40 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
1bf50 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e  che and treat an
1bf60 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72  y.  ** open jour
1bf70 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f  nal file as a ho
1bf80 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t-journal..  */.
1bf90 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1bfa0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1bfb0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
1bfc0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 50 61 67  >nRef==0 && pPag
1bfd0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1bfe0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1bff0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1c000 20 20 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20      isHot = 1;. 
1c010 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 72     }.    pager_r
1c020 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c030 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1c040 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
1c050 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1c060 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
1c070 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
1c080 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
1c090 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
1c0a0 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
1c0b0 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
1c0c0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
1c0d0 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
1c0e0 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
1c0f0 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
1c100 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
1c110 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
1c120 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1c130 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
1c140 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
1c150 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
1c160 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1c170 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
1c180 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1c190 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1c1a0 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  || isHot ){.    
1c1b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c1c0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c1d0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
1c1e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c1f0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
1c200 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
1c210 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
1c220 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
1c230 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1c240 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
1c250 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
1c260 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c280 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1c290 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1c2a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c2b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c2c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1c2d0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
1c2e0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
1c2f0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
1c300 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
1c310 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
1c320 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
1c330 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1c340 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
1c350 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
1c360 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
1c370 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
1c380 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
1c390 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
1c3a0 29 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20  ) || isHot ){.  
1c3b0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1c3c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1c3d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c3e0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1c3f0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1c400 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1c410 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1c420 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1c430 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1c440 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1c450 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1c460 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1c470 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1c480 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1c490 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c4a0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1c4b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1c4c0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1c4d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1c4e0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1c4f0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1c500 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1c510 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1c520 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1c530 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1c540 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1c550 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1c560 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1c570 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1c580 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1c590 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1c5a0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1c5b0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1c5c0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1c5d0 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1c5e0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
1c5f0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1c600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1c610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c620 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1c630 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
1c640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c650 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1c660 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1c670 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1c680 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1c690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c6a0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1c6b0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c6d0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1c6e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1c6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c700 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c710 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1c720 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20  E;.        }. . 
1c730 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
1c740 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1c750 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
1c760 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1c770 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   if.        ** w
1c780 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1c790 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1c7a0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 20   file. .        
1c7b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
1c7c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1c7d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1c7e0 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66  be locked itself
1c7f0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
1c800 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
1c810 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
1c820 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
1c830 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
1c840 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  .        ** a wr
1c850 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
1c860 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
1c870 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
1c880 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   more.        **
1c890 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
1c8a0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
1c8b0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1c8c0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1c8d0 20 20 20 20 2a 2a 20 4f 70 65 6e 20 74 68 65 20      ** Open the 
1c8e0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
1c8f0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
1c900 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
1c910 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  n .        ** ex
1c920 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1c930 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
1c940 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1c950 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
1c960 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
1c970 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
1c980 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
1c990 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
1c9a0 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ms, the.        
1c9b0 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20  ** OsTruncate() 
1c9c0 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63  call used in exc
1c9d0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1c9e0 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73  de also requires
1c9f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65  .        ** a re
1ca00 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
1ca10 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndle..        */
1ca20 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73  .        if( !is
1ca30 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Hot ){.         
1ca40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1ca50 59 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  Y;.          if(
1ca60 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1ca70 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1ca80 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1ca90 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
1caa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1cab0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
1cac0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
1cad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1cae0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
1caf0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1cb10 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1cb20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
1cb30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cb40 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1cb50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1cb60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
1cb70 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
1cb80 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1cb90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1cba0 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
1cbb0 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ds );.          
1cbc0 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54    if( fout&SQLIT
1cbd0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1cbe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1cbf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1cc00 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y;.             
1cc10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1cc20 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1cc30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1cc40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cc50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1cc60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cc70 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
1cc80 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1cc90 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1cca0 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ((rc==SQLITE_NOM
1ccb0 45 4d 7c 7c 72 63 3d 3d 53 51 4c 49 54 45 5f 49  EM||rc==SQLITE_I
1ccc0 4f 45 52 52 5f 4e 4f 4d 45 4d 29 3f 72 63 3a 53  OERR_NOMEM)?rc:S
1ccd0 51 4c 49 54 45 5f 42 55 53 59 29 3b 0a 20 20 20  QLITE_BUSY);.   
1cce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1ccf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1cd00 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1cd10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1cd20 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
1cd30 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1cd40 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
1cd50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
1cd60 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
1cd70 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cd80 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20  alHdr = 0;. .   
1cd90 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
1cda0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
1cdb0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
1cdc0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
1cdd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  e.        ** loc
1cde0 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
1cdf0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
1ce00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ce10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1ce20 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
1ce30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ce40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ce50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ce60 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1ce70 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1ce80 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1ce90 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  t(pPager->state=
1cea0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1ceb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
1cec0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1ced0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
1cee0 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
1cef0 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ED).        );. 
1cf00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1cf10 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
1cf20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1cf30 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
1cf40 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
1cf50 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
1cf60 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20  ase file.       
1cf70 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
1cf80 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
1cf90 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
1cfa0 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
1cfb0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
1cfc0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1cfd0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
1cfe0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
1cff0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  se.        ** ha
1d000 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
1d010 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1d020 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
1d030 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20  lush the.       
1d040 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
1d050 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1d060 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
1d070 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
1d080 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
1d090 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
1d0a0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66         ** at off
1d0b0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
1d0c0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
1d0d0 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
1d0e0 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  ytes are.       
1d0f0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
1d100 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
1d110 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
1d120 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
1d130 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
1d140 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
1d150 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
1d160 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
1d170 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  n.        ** a c
1d180 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
1d190 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
1d1a0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
1d1b0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
1d1c0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
1d1d0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
1d1e0 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  t be .        **
1d1f0 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
1d200 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
1d210 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
1d220 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
1d230 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
1d240 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
1d250 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d260 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
1d270 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
1d280 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
1d290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1d2a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1d2b0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
1d2c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d2d0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
1d2e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1d2f0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
1d300 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
1d310 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
1d320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f   ){.          IO
1d330 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
1d340 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1d350 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1d360 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  rs)));.         
1d370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1d380 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1d390 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
1d3a0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c  eof(dbFileVers),
1d3b0 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   24);.          
1d3c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d3d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d3e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d410 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
1d420 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
1d430 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1d440 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
1d450 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
1d460 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d470 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d480 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
1d490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
1d4a0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d4b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d4c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1d4d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1d4e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
1d4f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
1d500 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1d510 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1d520 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1d530 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
1d540 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1d550 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
1d560 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1d580 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65  ate a PgHdr obje
1d590 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65  ct.   Either cre
1d5a0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72  ate a new one or
1d5b0 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69   reuse.** an exi
1d5c0 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69  sting one that i
1d5d0 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
1d5e0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  in use..**.** A 
1d5f0 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74  new PgHdr struct
1d600 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69  ure is created i
1d610 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
1d620 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72  lowing are.** tr
1d630 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ue:.**.**     (1
1d640 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65  )  We have not e
1d650 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69  xceeded our maxi
1d660 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  mum allocated ca
1d670 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1d680 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74       as set by t
1d690 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  he "PRAGMA cache
1d6a0 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  _size" command..
1d6b0 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
1d6c0 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73  here are no unus
1d6d0 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ed PgHdr objects
1d6e0 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68   available at th
1d6f0 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  is time..**.**  
1d700 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20     (3)  This is 
1d710 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1d720 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
1d730 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20   (4)  There are 
1d740 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  no PgHdr objects
1d750 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
1d760 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  uire a journal.*
1d770 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  *          file 
1d780 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20  sync and a sync 
1d790 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1d7a0 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
1d7b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f  .**          pro
1d7c0 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  hibited..**.** O
1d7d0 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20  therwise, reuse 
1d7e0 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64  an existing PgHd
1d7f0 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
1d800 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20  ds, reuse an.** 
1d810 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69  existing PgHdr i
1d820 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1d830 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1d840 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
1d850 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20  We have reached 
1d860 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20  or exceeded the 
1d870 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69  maximum cache si
1d880 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
1d890 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d  llowed by "PRAGM
1d8a0 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a  A cache_size"..*
1d8b0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
1d8c0 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61  ere is a PgHdr a
1d8d0 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67  vailable with Pg
1d8e0 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a  Hdr->nRef==0.**.
1d8f0 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61  **     (3)  We a
1d900 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d  re not in an in-
1d910 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
1d920 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45  **.**     (4)  E
1d930 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61  ither there is a
1d940 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64  n available PgHd
1d950 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  r that does not 
1d960 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  need.**         
1d970 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f   to be synced to
1d980 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69   disk or else di
1d990 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75  sk syncing is cu
1d9a0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
1d9b0 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a      allowed..*/.
1d9c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d9d0 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67  AllocatePage(Pag
1d9e0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
1d9f0 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74  r **ppPg){.  int
1da00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1da10 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1da20 20 69 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a   int nByteHdr;..
1da30 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
1da40 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f  w PgHdr if any o
1da50 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69  f the four condi
1da60 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20  tions defined . 
1da70 20 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65   ** above are me
1da80 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  t: */.  if( pPag
1da90 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
1daa0 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70  ->mxPage.   || p
1dab0 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1dac0 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44  t==0 .   || MEMD
1dad0 42 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d  B.   || (pPager-
1dae0 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1daf0 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
1db00 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a  doNotSync).  ){.
1db10 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
1db20 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1db30 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e  >nPage>=pPager->
1db40 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70  nHash ){.      p
1db50 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
1db60 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20  _table(pPager,. 
1db70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1db80 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20  nHash<256 ? 256 
1db90 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a  : pPager->nHash*
1dba0 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  2);.      if( pP
1dbb0 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29  ager->nHash==0 )
1dbc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1dbd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1dbe0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1dbf0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1dc00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1dc10 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1dc20 72 29 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72  r);.    nByteHdr
1dc30 20 3d 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20   = sizeof(*pPg) 
1dc40 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
1dc50 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d               + M
1dc70 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
1dc80 73 74 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20  story);.    pPg 
1dc90 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1dca0 28 20 6e 42 79 74 65 48 64 72 20 29 3b 0a 20 20  ( nByteHdr );.  
1dcb0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
1dcc0 20 20 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74     pData = sqlit
1dcd0 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
1dce0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1dcf0 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d       if( pData==
1dd00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1dd10 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
1dd20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 30 3b          pPg = 0;
1dd30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dd40 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
1dd50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1dd60 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Pg==0 ){.      r
1dd70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1dd80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
1dd90 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
1dda0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
1ddb0 74 28 70 50 67 2c 20 30 2c 20 6e 42 79 74 65 48  t(pPg, 0, nByteH
1ddc0 64 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  dr);.    pPg->pD
1ddd0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  ata = pData;.   
1dde0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
1ddf0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1de00 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
1de10 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61  r->pAll;.    pPa
1de20 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
1de30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  .    pPager->nPa
1de40 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ge++;.  }else{. 
1de50 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e     /* Recycle an
1de60 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77   existing page w
1de70 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63  ith a zero ref-c
1de80 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ount. */.    rc 
1de90 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
1dea0 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20  pPager, &pPg);. 
1deb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1dec0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
1ded0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1dee0 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  R_BLOCKED;.    }
1def0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1df00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1df10 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1df20 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
1df30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1df40 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
1df50 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
1df60 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ert(pPg);.  }.  
1df70 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61  *ppPg = pPg;..pa
1df80 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1df90 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
1dfa0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1dfb0 65 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f  e we have the co
1dfc0 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65  ntent for a page
1dfd0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77  .  If the page w
1dfe0 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  as.** previously
1dff0 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
1e000 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65  oContent==1, the
1e010 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61  n the content wa
1e020 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61  s.** just initia
1e030 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69  lized to zeros i
1e040 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20  nstead of being 
1e050 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1e060 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65  ** But now we ne
1e070 65 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61  ed the real data
1e080 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53   off of disk.  S
1e090 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a  o make sure we.*
1e0a0 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64  * have it.  Read
1e0b0 20 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20   it in if we do 
1e0c0 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65  not have it alre
1e0d0 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ady..*/.static i
1e0e0 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  nt pager_get_con
1e0f0 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  tent(PgHdr *pPg)
1e100 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  {.  if( pPg->nee
1e110 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74  dRead ){.    int
1e120 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e130 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50  (pPg->pPager, pP
1e140 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  g, pPg->pgno);. 
1e150 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
1e170 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1e180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e1a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e1b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e1c0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
1e1d0 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
1e1e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
1e1f0 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
1e200 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
1e210 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
1e220 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
1e230 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
1e240 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
1e250 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
1e260 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e270 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
1e280 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
1e290 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
1e2a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
1e2b0 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
1e2c0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
1e2d0 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
1e2e0 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
1e2f0 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
1e300 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
1e310 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
1e320 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1e330 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
1e340 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
1e350 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
1e360 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
1e370 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
1e380 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
1e390 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
1e3a0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
1e3b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
1e3c0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
1e3d0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
1e3e0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
1e3f0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
1e400 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
1e410 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1e420 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
1e430 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1e440 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
1e450 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
1e460 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
1e470 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
1e480 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
1e490 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
1e4a0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1e4b0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
1e4c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1e4d0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
1e4e0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
1e4f0 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
1e500 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
1e510 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
1e520 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
1e530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
1e540 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
1e550 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
1e560 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
1e570 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
1e580 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
1e590 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
1e5a0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
1e5b0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
1e5c0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
1e5d0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
1e5e0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
1e5f0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
1e600 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1e610 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
1e620 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
1e630 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
1e640 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
1e650 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f  disk..** If noCo
1e660 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
1e670 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
1e680 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
1e690 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
1e6a0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  * of the page at
1e6b0 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64   this time, so d
1e6c0 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20  o not do a disk 
1e6d0 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c  read.  Just fill
1e6e0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   in the.** page 
1e6f0 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
1e700 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68  os.  But mark th
1e710 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68  e fact that we h
1e720 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65  ave not read the
1e730 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73  .** content by s
1e740 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
1e750 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20  .needRead flag. 
1e760 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a   Later on, if .*
1e770 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
1e780 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1e790 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20  on this page or 
1e7a0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
1e7b0 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61  is.** called aga
1e7c0 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  in with noConten
1e7d0 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==0, that means
1e7e0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
1e7f0 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61  t is needed.** a
1e800 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64  nd the disk read
1e810 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
1e820 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
1e830 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e840 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
1e850 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
1e860 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
1e870 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e880 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1e890 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
1e8a0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1e8b0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
1e8c0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1e8d0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
1e8e0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
1e8f0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
1e900 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
1e910 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
1e920 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
1e930 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
1e940 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
1e950 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
1e960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e970 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1e980 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
1e990 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
1e9a0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  1 );..  /* The m
1e9b0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
1e9c0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
1e9d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e9e0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
1e9f0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
1ea00 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
1ea10 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
1ea20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
1ea30 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
1ea40 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
1ea50 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
1ea60 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1ea70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ea80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ea90 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1eaa0 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
1eab0 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
1eac0 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
1ead0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1eae0 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
1eaf0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
1eb00 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
1eb10 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
1eb20 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
1eb30 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
1eb40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
1eb50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
1eb60 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
1eb70 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
1eb80 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
1eb90 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
1eba0 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
1ebb0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
1ebc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ebd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1ebe0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1ebf0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1ec00 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
1ec10 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
1ec20 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1ec30 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
1ec40 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
1ec50 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
1ec60 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
1ec70 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
1ec80 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20  t nMax;.    int 
1ec90 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  h;.    PAGER_INC
1eca0 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
1ecb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1ecc0 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61  AllocatePage(pPa
1ecd0 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ger, &pPg);.    
1ece0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ecf0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1ed00 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1ed10 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
1ed20 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  o;.    assert( !
1ed30 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50  MEMDB || pgno>pP
1ed40 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
1ed50 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
1ed60 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
1ed70 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
1ed80 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
1ed90 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65  o);.    pPg->nee
1eda0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
1edb0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1edc0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
1edd0 31 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  1;..    pPager->
1ede0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
1edf0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
1ee00 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
1ee10 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
1ee20 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
1ee30 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
1ee40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
1ee50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1ee60 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1ee70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1ee80 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1ee90 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
1eea0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73  errCode;.      s
1eeb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1eec0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74  (pPg);.      ret
1eed0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1eee0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
1eef0 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
1ef00 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
1ef10 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1ef20 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
1ef30 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
1ef40 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
1ef50 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
1ef60 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  /.    if( nMax<(
1ef70 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
1ef80 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20  B || (noContent 
1ef90 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
1efa0 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20  ysRollback) ){. 
1efb0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1efc0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1efd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1efe0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1eff0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1f000 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1f010 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
1f020 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1f030 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
1f040 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1f050 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1f060 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70   noContent && !p
1f070 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1f080 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  lback;.      IOT
1f090 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
1f0a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1f0b0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1f0c0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1f0d0 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
1f0e0 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
1f0f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f100 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1f110 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1f120 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  D ){.        pPg
1f130 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  ->pgno = 0;.    
1f140 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f150 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1f160 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1f180 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1f190 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69      }..    /* Li
1f1a0 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  nk the page into
1f1b0 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74   the page hash t
1f1c0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20  able */.    h = 
1f1d0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
1f1e0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73  nHash-1);.    as
1f1f0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1f200 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
1f210 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1f220 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
1f230 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1f240 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
1f250 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
1f260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1f270 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
1f280 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
1f290 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1f2a0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
1f2b0 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  g;.    }..#ifdef
1f2c0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1f2d0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
1f2e0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1f2f0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1f300 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1f310 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1f320 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
1f330 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1f340 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
1f350 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
1f360 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
1f370 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
1f380 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
1f390 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1f3a0 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1f3b0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1f3c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1f3d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f3e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f3f0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
1f400 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
1f410 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1f420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1f430 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
1f440 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1f450 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1f460 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1f470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f480 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1f490 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1f4a0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1f4b0 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1f4c0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1f4d0 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1f4e0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1f4f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1f500 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1f510 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1f520 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1f530 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1f540 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
1f550 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1f560 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41  );.  rc = pagerA
1f570 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
1f580 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
1f590 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72  ontent);.  pager
1f5a0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1f5b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1f5c0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1f5d0 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
1f5e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
1f5f0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
1f600 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
1f610 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
1f620 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
1f630 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
1f640 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
1f650 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
1f660 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
1f670 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1f680 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
1f690 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1f6a0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1f6b0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
1f6c0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
1f6d0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
1f6e0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
1f6f0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
1f700 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1f710 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
1f720 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
1f730 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
1f740 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
1f750 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
1f760 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
1f770 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
1f780 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
1f790 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
1f7a0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
1f7b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f7c0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
1f7d0 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  pPg = 0;..  asse
1f7e0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1f7f0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
1f800 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e  =0 );..  pagerEn
1f810 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
1f820 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1f830 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1f840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1f850 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70  Pager->pAll || p
1f860 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1f870 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20  Mode );.  }else 
1f880 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1f890 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1f8a0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1f8b0 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ULL ){.    /* Do
1f8c0 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65   nothing */.  }e
1f8d0 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70  lse if( (pPg = p
1f8e0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1f8f0 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b  er, pgno))!=0 ){
1f900 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
1f910 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  g);.  }.  pagerL
1f920 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1f930 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
1f940 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
1f950 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
1f960 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1f970 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1f980 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
1f990 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
1f9a0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
1f9b0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
1f9c0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
1f9d0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
1f9e0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
1f9f0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1fa00 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
1fa10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1fa20 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
1fa30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1fa40 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
1fa50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1fa60 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1fa70 72 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  r;..  /* Decreme
1fa80 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
1fa90 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
1faa0 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  page.  */.  asse
1fab0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1fac0 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
1fad0 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
1fae0 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20  pPg->nRef--;..  
1faf0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1fb00 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
1fb10 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
1fb20 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
1fb30 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
1fb40 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
1fb50 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
1fb60 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
1fb70 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
1fb80 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20  g->nRef==0 ){.. 
1fb90 20 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50     lruListAdd(pP
1fba0 67 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  g);.    if( pPag
1fbb0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
1fbc0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1fbd0 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67  >xDestructor(pPg
1fbe0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1fbf0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
1fc00 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
1fc10 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
1fc20 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
1fc30 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
1fc40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
1fc50 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
1fc60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1fc70 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
1fc80 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
1fc90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1fca0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28  er->nRef==0 && (
1fcb0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
1fcc0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
1fcd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
1fce0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e  ){.      pagerUn
1fcf0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
1fd00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1fd10 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
1fd20 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1fd30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fd40 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
1fd50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1fd60 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
1fd70 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
1fd80 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
1fd90 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1fda0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1fdb0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
1fdc0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1fdd0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
1fde0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1fdf0 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
1fe00 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
1fe10 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
1fe20 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
1fe30 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1fe40 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
1fe50 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
1fe60 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1fe70 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
1fe80 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1fe90 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
1fea0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1feb0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1fec0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1fed0 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
1fee0 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
1fef0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
1ff00 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
1ff10 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ff20 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1ff30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ff40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1ff50 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
1ff60 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
1ff70 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
1ff80 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1ff90 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
1ffa0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1ffb0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  nt(pPager);.  pa
1ffc0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
1ffd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
1ffe0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1fff0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
20000 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
20010 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
20020 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
20030 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
20040 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
20050 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
20060 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
20070 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a  n_journal;.  }..
20080 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
20090 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c  mpFile ){.    fl
200a0 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
200b0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
200c0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
200d0 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d  MP_JOURNAL);.  }
200e0 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20  else{.    flags 
200f0 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
20100 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
20110 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20120 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
20130 52 49 54 45 0a 20 20 72 63 20 3d 20 73 71 6c 69  RITE.  rc = sqli
20140 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
20150 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
20160 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
20170 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
20180 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
20190 28 70 50 61 67 65 72 29 0a 20 20 29 3b 0a 23 65  (pPager).  );.#e
201a0 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  lse.  rc = sqlit
201b0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
201c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
201d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
201e0 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
201f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20200 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
20210 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
20220 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
20230 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
20240 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
20250 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
20260 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
20270 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
20280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
20290 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
202a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
202b0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
202c0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
202d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
202e0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
202f0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
20300 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20310 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
20320 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
20330 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
20340 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
20350 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
20360 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
20370 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
20380 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
20390 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
203a0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
203b0 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20  rCode;.    goto 
203c0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
203d0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  ournal;.  }.  pP
203e0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
203f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
20400 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  e;..  rc = write
20410 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
20420 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  r);..  if( pPage
20430 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
20440 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
20450 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20460 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
20470 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
20480 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20490 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
204a0 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53  E_NOMEM && rc!=S
204b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
204c0 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  M ){.    rc = pa
204d0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
204e0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
204f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
20510 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
20520 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20530 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f   rc;..failed_to_
20540 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20  open_journal:.  
20550 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
20560 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
20570 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
20580 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
20590 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
205a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
205b0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
205c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
205d0 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d   The lock is rem
205e0 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  oved when.** the
205f0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
20600 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a  owing happen:.**
20610 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
20620 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
20630 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  Two() is called.
20640 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
20650 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
20660 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
20670 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
20680 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
20690 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
206a0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73  3PagerUnref() is
206b0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
206c0 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
206d0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
206e0 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
206f0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
20700 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20710 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
20720 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
20730 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
20740 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
20750 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
20760 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
20770 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
20780 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
20790 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
207a0 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
207b0 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
207c0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
207d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
207e0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
207f0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
20800 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
20810 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
20820 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
20830 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20840 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
20850 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
20860 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
20870 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
20880 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
20890 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
208a0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
208b0 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
208c0 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
208d0 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
208e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
208f0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
20900 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
20910 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
20920 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
20930 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
20940 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
20950 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
20960 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
20970 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
20980 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  o-op..**.** If e
20990 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67  xFlag is true, g
209a0 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20  o ahead and get 
209b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
209c0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  k on the file.**
209d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73   immediately ins
209e0 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20  tead of waiting 
209f0 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20  until we try to 
20a00 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
20a10 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20    The.** exFlag 
20a20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20  is ignored if a 
20a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
20a40 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
20a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20a60 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a  erBegin(DbPage *
20a70 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29  pPg, int exFlag)
20a80 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
20a90 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
20aa0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20ab0 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e  TE_OK;.  pagerEn
20ac0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
20ad0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
20ae0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
20af0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
20b00 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
20b10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
20b20 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
20b30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20b40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
20b50 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
20b60 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
20b70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
20b80 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
20b90 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
20ba0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
20bb0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
20bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
20bd0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
20be0 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
20bf0 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
20c00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
20c20 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20c30 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
20c40 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
20c50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
20c60 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
20c70 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
20c80 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
20c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20ca0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
20cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20cc0 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28       pagerLeave(
20cd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
20ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20cf0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
20d00 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
20d10 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
20d20 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
20d30 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
20d40 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
20d50 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
20d60 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
20d70 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
20d80 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
20d90 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
20da0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
20db0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
20dc0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
20dd0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
20de0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
20df0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
20e00 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
20e10 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
20e20 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
20e30 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
20e40 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
20e50 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
20e60 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
20e70 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
20e80 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
20e90 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
20ea0 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
20eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
20ec0 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
20ed0 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74  open and truncat
20ee0 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20  ed to 0 bytes.. 
20ef0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
20f00 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
20f10 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
20f20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
20f30 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
20f40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
20f50 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
20f60 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
20f70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
20f80 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
20f90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
20fa0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
20fb0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20fc0 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e  Create( pPager->
20fd0 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61  dbSize );.    pa
20fe0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
20ff0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
21000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->pInJournal ){
21010 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21020 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
21030 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
21040 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
21050 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21060 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
21070 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
21080 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
21090 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
210a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
210b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
210c0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
210d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72  TE_OK );.  pager
210e0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
210f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21100 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
21110 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
21120 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
21130 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
21140 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
21150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21160 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
21170 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
21180 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20  g->dirty==0 ){. 
21190 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
211a0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
211b0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
211c0 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
211d0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44  rty = pPager->pD
211e0 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50  irty;.    if( pP
211f0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a  ager->pDirty ){.
21200 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44        pPager->pD
21210 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
21220 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
21230 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
21240 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
21250 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
21260 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
21270 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e  ke a page clean.
21280 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74    Clear its dirt
21290 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65  y bit and remove
212a0 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
212b0 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e  dirty page list.
212c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
212d0 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20  makeClean(PgHdr 
212e0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
212f0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70  ->dirty ){.    p
21300 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
21310 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72     if( pPg->pDir
21320 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ty ){.      asse
21330 72 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d  rt( pPg->pDirty-
21340 3e 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67  >pPrevDirty==pPg
21350 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
21360 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
21370 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
21380 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
21390 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
213a0 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ty ){.      asse
213b0 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  rt( pPg->pPrevDi
213c0 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  rty->pDirty==pPg
213d0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
213e0 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
213f0 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
21400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21410 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
21420 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70  Pager->pDirty==p
21430 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  Pg );.      pPg-
21440 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  >pPager->pDirty 
21450 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
21460 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
21470 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
21480 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
21490 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
214a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
214b0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
214c0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
214d0 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
214e0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
214f0 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
21500 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
21510 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
21520 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
21530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
21540 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
21550 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
21560 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
21570 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
21580 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
21590 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
215a0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
215b0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
215c0 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
215d0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
215e0 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
215f0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
21600 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
21610 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
21620 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
21630 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
21640 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
21650 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
21660 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
21670 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
21680 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
21690 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
216a0 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
216b0 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
216c0 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
216d0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
216e0 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
216f0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
21700 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
21710 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
21720 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
21730 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
21740 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
21750 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
21760 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
21770 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
21780 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
21790 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
217a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
217b0 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
217c0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
217d0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
217e0 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g);.  Pager *pPa
217f0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
21800 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
21810 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
21820 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
21830 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
21840 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
21850 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
21860 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
21870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
21880 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
21890 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
218a0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
218b0 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
218c0 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
218d0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
218e0 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73  If this page was
218f0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
21900 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
21910 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61  ent==1, that mea
21920 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27  ns.  ** we didn'
21930 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e  t really read in
21940 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21950 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
21960 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20  can happen.  ** 
21970 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68  (for example) wh
21980 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
21990 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
219a0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74  e freelist.  But
219b0 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65  .  ** now we are
219c0 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e   (perhaps) movin
219d0 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f  g the page off o
219e0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66  f the freelist f
219f0 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e  or.  ** reuse an
21a00 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  d we need to kno
21a10 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  w its original c
21a20 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63  ontent so that c
21a30 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20  ontent.  ** can 
21a40 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
21a50 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
21a60 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65  l.  So do the re
21a70 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ad at this.  ** 
21a80 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  time..  */.  rc 
21a90 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
21aa0 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
21ab0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
21ac0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   rc;.  }..  /* M
21ad0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
21ae0 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
21af0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
21b00 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
21b10 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
21b20 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
21b30 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
21b40 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79    */.  makeDirty
21b50 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
21b60 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
21b70 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
21b80 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  pPg) || pPager->
21b90 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
21ba0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
21bb0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
21bc0 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
21bd0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
21be0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
21bf0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
21c00 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
21c10 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
21c20 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
21c30 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
21c40 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
21c50 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
21c60 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
21c70 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
21c80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
21c90 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
21ca0 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
21cb0 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
21cc0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
21cd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21ce0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
21cf0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
21d00 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
21d10 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
21d20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21d30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
21d40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
21d50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
21d60 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
21d70 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
21d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21d90 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
21da0 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
21db0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
21dc0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
21dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
21de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
21df0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21e10 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
21e20 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
21e30 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
21e40 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
21e50 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
21e60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
21e70 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
21e80 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
21e90 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
21ea0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
21eb0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
21ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
21ed0 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
21ee0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
21ef0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21f00 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
21f10 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
21f20 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
21f30 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
21f40 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
21f50 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
21f60 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
21f70 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
21f80 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
21f90 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
21fa0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
21fb0 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f           PgHisto
21fc0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
21fd0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
21fe0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
21ff0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a    PAGERTRACE3("J
22000 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
22010 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
22020 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
22030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
22040 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
22050 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
22060 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
22070 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
22080 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22090 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
220a0 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  f( !pHist->pOrig
220b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
220c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
220d0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
220e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
220f0 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
22100 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
22110 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
22120 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
22130 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22140 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
22150 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
22160 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  2;..          /*
22170 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
22180 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
22190 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
221a0 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
221b0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
221c0 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
221d0 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
221e0 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
221f0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
22200 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
22210 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
22220 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
22230 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
22240 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
22250 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
22260 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
22270 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
22280 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
22290 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
222a0 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
222b0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  2);.          rc
222c0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
222d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
222e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
222f0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
22300 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22320 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22330 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
22340 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
22350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22360 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22380 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22390 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
223a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
223b0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
223c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
223d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
223e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
223f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22400 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
22410 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
22420 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
22430 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
22440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
22450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22460 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
22470 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54   }.          IOT
22480 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
22490 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
224a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
224b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
224c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
224d0 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
224e0 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
224f0 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
22500 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
22510 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
22520 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
22530 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE5("JOURNAL %d
22540 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
22550 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
22560 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22570 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
22580 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
22590 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61  Pg->needSync, pa
225a0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
225b0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ));..          /
225c0 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
225d0 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74  ccured writing t
225e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
225f0 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
22600 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
22610 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
22620 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
22630 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
22640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
22650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22670 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22680 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
22690 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
226a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ++;.          as
226b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
226c0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
226d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
226e0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
226f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
22700 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
22710 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
22720 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
22730 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
22740 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
22750 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
22760 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
22770 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
22780 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
22790 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
227a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
227b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
227c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
227d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
227e0 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
227f0 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
22800 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
22810 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
22820 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22840 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
22850 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
22860 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
22870 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
22880 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
22890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
228a0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
228b0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
228c0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
228d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
228e0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
228f0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
22900 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
22910 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
22920 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
22930 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
22940 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
22950 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
22960 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
22970 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
22980 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
22990 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
229a0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
229b0 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
229c0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
229d0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
229e0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
229f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
22a00 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
22a10 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
22a20 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
22a30 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
22a40 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
22a50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
22a60 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
22a70 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
22a80 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
22a90 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
22aa0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
22ab0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
22ac0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
22ad0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
22ae0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
22af0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
22b00 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
22b10 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
22b20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
22b30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22b40 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
22b50 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
22b60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
22b70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
22b80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
22b90 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
22ba0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
22bb0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
22bc0 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
22bd0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
22be0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22bf0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
22c00 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
22c10 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
22c20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22c30 20 20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73          i64 offs
22c40 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  et = pPager->stm
22c50 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  tNRec*(4+pPager-
22c60 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
22c70 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
22c80 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
22c90 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
22ca0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
22cb0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
22cc0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f  (pPager->stfd, o
22cd0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
22ce0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
22cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22d00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22d10 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
22d20 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74  ager->stfd, pDat
22d30 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
22d40 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
22d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22d60 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
22d70 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
22d80 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
22d90 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
22da0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
22db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22dc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22dd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
22df0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b  ger->stmtNRec++;
22e00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22e10 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
22e20 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
22e30 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
22e40 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
22e50 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
22e60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22e70 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
22e80 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
22e90 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
22ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22eb0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
22ec0 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
22ed0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
22ee0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
22ef0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
22f00 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
22f10 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
22f20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
22f30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
22f40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
22f50 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
22f60 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
22f70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
22f90 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
22fa0 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
22fb0 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
22fc0 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
22fd0 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
22fe0 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
22ff0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
23000 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
23010 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
23020 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
23030 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
23040 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
23050 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
23060 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
23070 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
23080 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
23090 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
230a0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
230b0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
230c0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
230d0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
230e0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
230f0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
23100 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
23110 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
23120 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
23130 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
23140 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
23150 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
23160 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
23170 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
23180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
23190 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
231a0 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
231b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
231c0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
231d0 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
231e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
231f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23200 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  );..  pagerEnter
23210 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
23220 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50  !MEMDB && nPageP
23230 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
23240 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
23250 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
23260 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
23270 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
23280 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
23290 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
232a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
232b0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
232c0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
232d0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
232e0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
232f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23300 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
23310 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
23320 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
23330 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  ii;.    int need
23340 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
23350 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
23360 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
23370 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
23380 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
23390 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
233a0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
233b0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
233c0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
233d0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
233e0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
233f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
23400 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
23410 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23420 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
23430 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
23440 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
23450 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
23460 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
23470 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
23480 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
23490 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
234a0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
234b0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
234c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
234d0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
234e0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
234f0 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
23500 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
23510 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
23520 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
23530 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c  nPageCount = sql
23540 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
23550 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
23560 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
23570 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
23580 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
23590 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
235a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
235b0 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
235c0 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
235d0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
235e0 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
235f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23600 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
23610 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
23620 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
23630 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
23640 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
23650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
23660 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
23670 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
23680 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
23690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
236a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
236b0 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
236c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
236d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
236e0 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
236f0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
23700 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
23710 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
23720 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
23730 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
23740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
23760 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
23770 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
23780 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
237a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
237b0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
237c0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
237d0 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
237f0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
23800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23810 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23820 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
23830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23840 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
23850 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
23860 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
23870 72 2c 20 70 67 29 29 20 29 7b 0a 20 20 20 20 20  r, pg)) ){.     
23880 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
23890 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
238a0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
238b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
238c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
238d0 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
238e0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
238f0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
23900 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
23910 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
23920 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
23930 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
23940 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
23950 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
23960 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
23970 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
23980 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
23990 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
239a0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
239b0 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
239c0 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
239d0 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
239e0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
239f0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
23a00 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
23a10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23a20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23a30 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
23a40 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
23a50 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e  nPage && needSyn
23a60 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
23a70 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
23a80 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
23a90 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
23aa0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
23ab0 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79   ) pPage->needSy
23ac0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
23ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
23ae0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
23af0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
23b00 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
23b10 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
23b20 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
23b30 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23b40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
23b50 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
23b60 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
23b70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
23b80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23b90 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
23ba0 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
23bb0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
23bc0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
23bd0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
23be0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
23bf0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
23c00 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
23c10 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
23c20 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
23c30 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
23c40 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
23c50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
23c60 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
23c70 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
23c80 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
23c90 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
23ca0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
23cb0 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
23cc0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
23cd0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
23ce0 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
23cf0 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
23d00 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
23d10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
23d20 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
23d30 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
23d40 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
23d50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
23d60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65   int rc;..  page
23d70 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
23d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23d90 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
23da0 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
23db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23dc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
23dd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
23de0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
23df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23e00 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
23e10 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
23e20 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
23e30 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
23e40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
23e50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
23e60 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
23e70 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
23e80 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
23e90 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
23ea0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
23eb0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
23ec0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
23ed0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
23ee0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
23ef0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
23f00 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
23f10 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
23f20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
23f30 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
23f40 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
23f50 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
23f60 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
23f70 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
23f80 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
23f90 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
23fa0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
23fb0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
23fc0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
23fd0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
23fe0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
23ff0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
24000 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
24010 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
24020 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
24030 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
24040 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
24050 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
24060 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
24070 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
24080 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
24090 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
240a0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
240b0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
240c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
240d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
240e0 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
240f0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
24100 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
24110 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
24120 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24130 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
24140 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
24150 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
24160 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
24170 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
24180 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
24190 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
241a0 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
241b0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
241c0 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
241d0 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
241e0 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
241f0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
24200 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
24210 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
24220 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
24230 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
24240 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
24250 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
24260 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
24270 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
24280 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
24290 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
242a0 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
242b0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
242c0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
242d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
242e0 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
242f0 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
24300 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
24310 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
24320 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
24330 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
24340 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
24350 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
24360 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
24370 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
24380 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
24390 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
243a0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
243b0 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
243c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
243d0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
243e0 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
243f0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
24400 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  ager);.  pPg->al
24410 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
24420 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  ;.  if( pPg->dir
24430 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73  ty && !pPager->s
24440 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
24450 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24460 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
24470 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
24480 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
24490 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
244a0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
244b0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
244c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
244d0 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
244e0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
244f0 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
24500 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
24510 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
24520 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
24530 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
24540 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
24550 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
24560 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
24570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
24580 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
24590 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
245a0 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
245b0 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
245c0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
245d0 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
245e0 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
245f0 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
24600 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
24610 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
24620 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
24630 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
24640 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
24650 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
24660 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
24670 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
24680 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
24690 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
246a0 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
246b0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
246c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
246d0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
246e0 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
246f0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
24700 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
24710 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f  ager));.      IO
24720 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
24730 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
24740 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
24750 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
24760 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
24770 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
24780 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
24790 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
247a0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
247b0 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c    }.  }.  pagerL
247c0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
247d0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
247e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
247f0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
24800 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
24810 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
24820 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
24830 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
24840 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
24850 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
24860 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
24870 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
24880 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
24890 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
248a0 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
248b0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
248c0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
248d0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
248e0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
248f0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
24900 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
24910 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
24920 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24930 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
24940 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
24950 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
24960 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
24970 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
24980 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
24990 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
249a0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
249b0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  this point..**.*
249c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
249d0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
249e0 6f 6d 20 61 20 73 69 6e 67 6c 65 20 70 6c 61 63  om a single plac
249f0 65 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 20  e in the sqlite 
24a00 62 74 72 65 65 0a 2a 2a 20 63 6f 64 65 20 28 77  btree.** code (w
24a10 68 65 6e 20 61 20 6c 65 61 66 20 69 73 20 72 65  hen a leaf is re
24a20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
24a30 72 65 65 2d 6c 69 73 74 29 2e 20 54 68 69 73 20  ree-list). This 
24a40 61 6c 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 66 6f  allows the.** fo
24a50 6c 6c 6f 77 69 6e 67 20 61 73 73 75 6d 70 74 69  llowing assumpti
24a60 6f 6e 73 20 74 6f 20 62 65 20 6d 61 64 65 20 61  ons to be made a
24a70 62 6f 75 74 20 70 50 67 3a 0a 2a 2a 0a 2a 2a 20  bout pPg:.**.** 
24a80 20 20 31 2e 20 50 61 67 65 72 44 6f 6e 74 57 72    1. PagerDontWr
24a90 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63  ite() has been c
24aa0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
24ab0 65 2c 20 4f 52 20 0a 2a 2a 20 20 20 20 20 20 50  e, OR .**      P
24ac0 61 67 65 72 57 72 69 74 65 28 29 20 68 61 73 20  agerWrite() has 
24ad0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 61 6c  not yet been cal
24ae0 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  led on the page.
24af0 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 20  .**.**   2. The 
24b00 70 61 67 65 20 65 78 69 73 74 65 64 20 77 68 65  page existed whe
24b10 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
24b20 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 0a 2a  n was started..*
24b30 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 20 44 6f  *.** Details: Do
24b40 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 28 74 68  ntRollback() (th
24b50 69 73 20 72 6f 75 74 69 6e 65 29 20 69 73 20 6f  is routine) is o
24b60 6e 6c 79 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  nly called when 
24b70 61 20 6c 65 61 66 20 69 73 0a 2a 2a 20 72 65 6d  a leaf is.** rem
24b80 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
24b90 65 65 20 6c 69 73 74 2e 20 44 6f 6e 74 57 72 69  ee list. DontWri
24ba0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 77  te() is called w
24bb0 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 0a  henever a page .
24bc0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ** becomes a fre
24bd0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 2a 2f 0a  e-list leaf..*/.
24be0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24bf0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62  rDontRollback(Db
24c00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
24c10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
24c20 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61  g->pPager;..  pa
24c30 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
24c40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24c50 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
24c60 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20  _RESERVED );..  
24c70 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
24c80 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  l file is not op
24c90 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65  en, or DontWrite
24ca0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
24cb0 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20  ed on.  ** this 
24cc0 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28  page (DontWrite(
24cd0 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61 79  ) sets the alway
24ce0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c  sRollback flag),
24cf0 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20   then this.  ** 
24d00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
24d10 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
24d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
24d30 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61  pen==0 || pPg->a
24d40 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
24d50 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
24d60 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  ollback ){.    p
24d70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
24d80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24d90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45   }.  assert( !ME
24da0 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72  MDB );    /* For
24db0 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67 65 72   a memdb, pPager
24dc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73  ->journalOpen is
24dd0 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a 20 20   always 0 */..  
24de0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 50 61  /* Check that Pa
24df0 67 65 72 57 72 69 74 65 28 29 20 68 61 73 20 6e  gerWrite() has n
24e00 6f 74 20 79 65 74 20 62 65 65 6e 20 63 61 6c 6c  ot yet been call
24e10 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  ed on this page,
24e20 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 74   and.  ** that t
24e30 68 65 20 70 61 67 65 20 65 78 69 73 74 65 64 20  he page existed 
24e40 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
24e50 74 69 6f 6e 20 73 74 61 72 74 65 64 2e 0a 20 20  tion started..  
24e60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  */.  assert( !pP
24e70 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
24e80 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
24e90 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
24ea0 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65 72  Size );..  asser
24eb0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
24ec0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71  urnal!=0 );.  sq
24ed0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
24ee0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
24ef0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
24f00 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
24f10 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64  = 1;.  pPg->need
24f20 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  Read = 0;.  if( 
24f30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
24f40 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
24f50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
24f60 65 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  e <= pPager->ori
24f70 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  gDbSize );.    s
24f80 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
24f90 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
24fa0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
24fb0 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
24fc0 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
24fd0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
24fe0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
24ff0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
25000 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
25010 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
25020 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
25030 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25040 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  er);.}.../*.** T
25050 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25060 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
25070 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
25080 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
25090 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
250a0 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
250b0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
250c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
250d0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
250e0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
250f0 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29  r, int isDirect)
25100 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
25110 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
25120 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
25130 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25140 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
25150 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
25160 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  {.    /* Open pa
25170 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
25180 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
25190 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
251a0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
251b0 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
251c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
251d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
251e0 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44 69  ;..    if( !isDi
251f0 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63  rect ){.      rc
25200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25210 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
25220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25240 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25250 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
25260 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25280 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
25290 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
252a0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
252b0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
252c0 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63   */.    change_c
252d0 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
252e0 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
252f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
25300 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  );.    change_co
25310 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74  unter++;.    put
25320 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50  32bits(((char*)P
25330 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
25340 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65  Hdr))+24, change
25350 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
25360 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20  if( isDirect && 
25370 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
25380 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  hods ){.      co
25390 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
253a0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
253b0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63  PgHdr);.      rc
253c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
253d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  e(pPager->fd, zB
253e0 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
253f0 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Size, 0);.    }.
25400 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
25410 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
25420 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
25430 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
25440 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
25450 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
25460 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
25470 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25480 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
25490 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
254a0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
254b0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
254c0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
254d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
254e0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
254f0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
25500 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
25510 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
25520 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
25530 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
25540 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
25550 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
25560 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
25570 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
25580 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
25590 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
255a0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
255b0 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
255c0 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
255d0 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
255e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
255f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25600 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
25610 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
25620 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
25630 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
25640 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
25650 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25660 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
25670 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
25680 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
25690 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
256a0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
256b0 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
256c0 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
256d0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
256e0 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
256f0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
25700 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
25710 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
25720 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
25730 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
25740 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
25750 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
25760 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
25770 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
25780 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
25790 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
257a0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50 61  ommitPhaseOne(Pa
257b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
257c0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
257d0 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a  , Pgno nTrunc){.
257e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
257f0 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52  E_OK;..  PAGERTR
25800 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
25810 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
25820 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
25830 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
25840 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
25850 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
25860 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
25870 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66  Pager);..  /* If
25880 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
25890 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
258a0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
258b0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
258c0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
258d0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
258e0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
258f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
25900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
25910 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
25920 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
25930 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
25940 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
25950 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
25960 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
25970 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
25980 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
25990 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
259a0 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
259b0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
259c0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
259d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
259e0 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
259f0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
25a00 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
25a10 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
25a20 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
25a30 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
25a40 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
25a50 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
25a60 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
25a70 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
25a80 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
25a90 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
25aa0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
25ab0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
25ac0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
25ad0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
25ae0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
25af0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
25b00 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
25b10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
25b20 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
25b30 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
25b40 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
25b50 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
25b60 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20  seAtomicWrite = 
25b70 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74  (.        !zMast
25b80 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
25b90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
25ba0 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  f==jrnlBufferSiz
25bb0 65 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20  e(pPager) && .  
25bc0 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20        nTrunc==0 
25bd0 26 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d  && .        (0==
25be0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c  pPager->pDirty |
25bf0 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69  | 0==pPager->pDi
25c00 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  rty->pDirty).   
25c10 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41   );.    if( useA
25c20 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20  tomicWrite ){.  
25c30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
25c40 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
25c50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25c60 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  . */.      int o
25c70 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
25c80 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
25c90 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
25ca0 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  c);.      assert
25cb0 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31  (pPager->nRec==1
25cc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
25cd0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
25ce0 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  ->jfd, offset, p
25cf0 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
25d00 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
25d10 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
25d20 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66  e counter. The f
25d30 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
25d40 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20  ll modify.      
25d50 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ** the in-memory
25d60 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
25d70 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63  of page 1 to inc
25d80 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
25d90 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  .      ** change
25da0 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
25db0 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64  n write page 1 d
25dc0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
25dd0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
25de0 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
25df0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
25e00 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  te property of t
25e10 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
25e20 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74  tem, .      ** t
25e30 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
25e40 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
25e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25e60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
25e70 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
25e80 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
25e90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
25ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
25eb0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
25ec0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
25ed0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
25ee0 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69  f( !useAtomicWri
25ef0 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  te && rc==SQLITE
25f00 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20  _OK ).#endif..  
25f10 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
25f20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
25f30 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
25f40 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
25f50 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
25f60 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
25f70 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
25f80 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
25f90 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
25fa0 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
25fb0 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
25fc0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
25fd0 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
25fe0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
25ff0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
26000 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
26010 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
26020 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
26030 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
26040 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
26050 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
26060 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
26070 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
26080 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
26090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
260a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
260b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
260c0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
260d0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
260e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
260f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
26100 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64  sync_exit;.#ifnd
26110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26120 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
26130 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
26140 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
26150 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
26160 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
26170 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
26180 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
26190 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
261a0 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
261b0 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
261c0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
261d0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
261e0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
261f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
26200 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e  no i;.        in
26210 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
26220 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
26230 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
26240 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
26250 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
26260 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
26270 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
26280 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
26290 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
262a0 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
262b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
262c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
262d0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
262e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
262f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26300 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
26310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26330 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20  rite(pPg);.     
26340 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26350 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
26360 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
26370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
26380 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
26390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
263a0 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
263b0 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
263c0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
263d0 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
263e0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
263f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
26400 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
26410 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
26420 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
26430 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
26440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
26450 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69  o sync_exit;..#i
26460 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26470 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
26480 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
26490 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
264a0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
264b0 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
264c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
264d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
264e0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
264f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
26500 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
26510 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
26520 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
26530 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
26540 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
26550 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
26560 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
26570 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
26580 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
265a0 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 21 70  while( pPg && !p
265b0 50 67 2d 3e 64 69 72 74 79 20 29 7b 20 70 50 67  Pg->dirty ){ pPg
265c0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 20   = pPg->pDirty; 
265d0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
265e0 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
265f0 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78      goto sync_ex
26600 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  it;.    }.    pP
26610 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
26620 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
26630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26640 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
26650 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
26660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26670 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
26680 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
26690 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
266a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
266b0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
266c0 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
266d0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
266e0 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
266f0 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
26700 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
26710 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
26720 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
26730 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
26740 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
26750 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
26760 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
26770 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
26780 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
26790 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
267a0 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
267b0 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
267c0 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
267d0 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
267e0 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
267f0 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
26800 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
26810 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
26820 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
26830 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
26840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
26850 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
26860 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
26870 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
26880 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
26890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
268a0 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
268b0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
268c0 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
268d0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
268e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
268f0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
26900 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
26910 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
26920 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
26930 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
26940 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
26950 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
26960 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
26970 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
26980 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
26990 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
269a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
269b0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
269c0 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
269d0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
269e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
269f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
26a00 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
26a10 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
26a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26a30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
26a40 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
26a50 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52 54 52  ager);.  PAGERTR
26a60 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
26a70 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26a80 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
26a90 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
26aa0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
26ab0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
26ac0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
26ad0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
26ae0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
26af0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
26b00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
26b10 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
26b20 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
26b30 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
26b40 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
26b50 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
26b60 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
26b70 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
26b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
26b90 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
26ba0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
26bb0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
26bc0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
26bd0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
26be0 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
26bf0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
26c00 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
26c10 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
26c20 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
26c30 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
26c40 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
26c50 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
26c60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26c70 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
26c80 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
26c90 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
26ca0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
26cb0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
26cc0 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
26cd0 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
26ce0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
26cf0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
26d00 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
26d10 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
26d20 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
26d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26d40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26d50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
26d60 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
26d70 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  che );.  assert(
26d80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
26d90 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
26da0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
26db0 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
26dc0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
26dd0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
26de0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
26df0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
26e00 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26e10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26e20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
26e30 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
26e40 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
26e50 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
26e60 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
26e70 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
26e80 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
26e90 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
26ea0 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
26eb0 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
26ec0 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
26ed0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26ee0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
26ef0 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
26f00 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
26f10 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
26f20 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
26f30 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
26f40 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
26f50 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
26f60 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
26f70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
26f80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
26f90 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
26fa0 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
26fb0 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
26fc0 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
26fd0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
26fe0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
26ff0 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
27000 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
27010 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
27020 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
27030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27040 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
27050 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
27060 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
27070 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
27080 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27090 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
270a0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
270b0 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
270c0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
270d0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
270e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
270f0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
27100 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
27110 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
27120 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
27130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
27140 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
27150 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
27160 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
27170 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27180 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
27190 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
271a0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
271b0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
271c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
271d0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
271e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
271f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
27200 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
27210 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
27220 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
27230 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
27240 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27250 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
27260 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
27270 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
27280 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
27290 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
272a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
272b0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
272c0 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
272d0 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
272e0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
272f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
27300 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
27310 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
27320 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
27330 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
27340 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
27350 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
27360 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
27370 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
27380 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
27390 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
273a0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
273b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
273c0 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
273d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
273e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
273f0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
27400 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
27410 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
27420 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
27430 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
27440 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
27450 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
27460 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
27470 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
27480 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
27490 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
274a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
274b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
274c0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
274d0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
274e0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
274f0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
27500 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
27510 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27520 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
27530 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
27540 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
27550 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
27560 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
27570 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
27580 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
27590 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
275a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
275b0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
275c0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
275d0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
275e0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c      }.    pagerL
275f0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27600 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
27610 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
27620 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
27630 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
27640 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
27650 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
27660 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
27670 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
27680 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
27690 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
276a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
276b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
276c0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
276d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
276e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
276f0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
27700 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28   /* pager_reset(
27710 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50  pPager); */.  pP
27720 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
27730 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
27740 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
27750 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
27760 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
27770 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
27780 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
27790 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
277a0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
277b0 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
277c0 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
277d0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ent..  */.  rc =
277e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
277f0 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65  ger, rc);.  page
27800 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
27830 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
27840 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
27850 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
27860 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
27870 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
27880 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
27890 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
278a0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
278b0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
278c0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
278d0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
278e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
278f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
27900 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
27910 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
27920 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
27930 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
27940 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
27950 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
27960 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
27970 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27980 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
27990 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
279a0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
279b0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
279c0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
279d0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
279e0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
279f0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
27a00 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
27a10 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
27a20 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
27a30 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
27a40 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
27a50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
27a60 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
27a70 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
27a80 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
27a90 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
27aa0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
27ab0 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
27ac0 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
27ad0 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
27ae0 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
27af0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
27b00 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
27b10 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
27b20 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
27b30 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
27b40 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
27b50 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
27b60 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
27b70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
27b80 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
27b90 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
27ba0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
27bb0 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
27bc0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
27bd0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
27be0 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
27bf0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
27c00 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
27c10 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
27c20 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42  c int pagerStmtB
27c30 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
27c40 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27c50 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27c60 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
27c70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27c80 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
27c90 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
27ca0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
27cb0 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
27cc0 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
27cd0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27ce0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
27cf0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
27d00 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
27d10 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
27d20 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
27d30 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
27d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27d50 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
27d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
27d70 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
27d80 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
27d90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27da0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
27db0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
27dc0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61  rnalOpen );.  pa
27dd0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
27de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27df0 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29  er->pInStmt==0 )
27e00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  ;.  pPager->pInS
27e10 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  tmt = sqlite3Bit
27e20 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
27e30 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67  ->dbSize);.  pag
27e40 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
27e50 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
27e60 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
27e70 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
27e80 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
27e90 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
27ea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27eb0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
27ec0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
27ed0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
27ee0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
27ef0 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
27f00 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
27f10 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
27f20 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
27f30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
27f40 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
27f50 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
27f60 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
27f70 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
27f80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
27f90 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
27fa0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
27fb0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
27fc0 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
27fd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
27fe0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
27ff0 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
28000 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
28010 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
28020 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
28030 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
28040 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 50 61 67  ager->stfd, pPag
28050 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20  er->zStmtJrnl,. 
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28070 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
28080 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
28090 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NAL);.    if( rc
280a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
280b0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
280c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
280d0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
280e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
280f0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
28100 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
28110 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
28120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
28130 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
28140 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
28150 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  pInStmt ){.    s
28160 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
28170 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
28180 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
28190 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
281a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
281b0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
281c0 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
281d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
281e0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
281f0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
28200 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69   = pagerStmtBegi
28210 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  n(pPager);.  pag
28220 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28240 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
28250 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
28260 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
28270 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  mtCommit(Pager *
28280 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72  pPager){.  pager
28290 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
282a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
282b0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
282c0 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
282d0 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
282e0 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
282f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28300 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
28310 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
28320 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
28330 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
28340 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
28350 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
28360 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
28370 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61  Stmt);.      pPa
28380 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
28390 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
283a0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
283b0 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
283c0 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
283d0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
283e0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
283f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
28400 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
28410 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
28420 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mt;.        asse
28430 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d  rt( pHist->inStm
28440 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  t );.        pHi
28450 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
28460 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
28470 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
28480 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
28490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
284a0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
284b0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
284c0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
284d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
284e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
284f0 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
28500 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
28510 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
28520 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
28530 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
28540 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  pen = 0;.  pager
28550 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28570 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
28580 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
28590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
285a0 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
285b0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
285c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
285d0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
285e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
285f0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
28600 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
28610 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
28620 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28630 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
28640 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
28650 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67  r *pPg;.      Pg
28660 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
28670 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
28680 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
28690 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65  ; pPg=pHist->pNe
286a0 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
286b0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
286c0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
286d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
286e0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
286f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28700 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
28710 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
28720 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
28730 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
28740 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
28750 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
28760 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
28770 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
28780 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
28790 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
287a0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
287b0 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ze;.      pager_
287c0 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
287d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
287e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
287f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
28800 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
28810 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
28820 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28830 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
28840 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
28850 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
28860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
28870 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
28880 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c  en = 0;.  pagerL
28890 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
288a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
288b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
288c0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
288d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
288e0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
288f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
28900 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
28910 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
28920 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
28930 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
28940 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
28950 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
28960 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
28970 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
28980 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
28990 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
289a0 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
289b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
289c0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
289d0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
289e0 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
289f0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
28a00 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
28a10 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
28a20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
28a30 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
28a40 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
28a50 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
28a60 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
28a70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
28a80 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
28a90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28aa0 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
28ab0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28ac0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
28ad0 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
28ae0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
28af0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
28b00 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
28b10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28b20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
28b30 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
28b40 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
28b50 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
28b60 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
28b70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28b80 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
28b90 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
28ba0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
28bb0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
28bc0 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
28bd0 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
28be0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
28bf0 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
28c00 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
28c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
28c20 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
28c30 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
28c40 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
28c50 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
28c60 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
28c70 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
28c80 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
28c90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28ca0 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
28cb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
28cc0 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
28cd0 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
28ce0 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
28cf0 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
28d00 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
28d10 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
28d20 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
28d30 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64  CodecArg;.}.#end
28d40 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
28d50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
28d60 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
28d70 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
28d80 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
28d90 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
28da0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
28db0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
28dc0 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
28dd0 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
28de0 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
28df0 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
28e00 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
28e10 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
28e20 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
28e30 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
28e40 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
28e50 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
28e60 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
28e70 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
28e80 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
28e90 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
28ea0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
28eb0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
28ec0 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
28ed0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
28ee0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
28ef0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
28f00 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
28f10 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
28f20 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
28f30 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
28f40 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
28f50 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
28f60 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
28f70 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
28f80 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
28f90 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
28fa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
28fb0 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
28fc0 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
28fd0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
28fe0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
28ff0 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
29000 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
29010 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
29020 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
29030 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
29040 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
29050 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
29060 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
29070 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29080 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
29090 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
290a0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
290b0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
290c0 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
290d0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
290e0 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20  . */.  int h;.  
290f0 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
29100 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72 45  o = 0;..  pagerE
29110 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
29120 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
29130 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
29140 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
29150 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
29160 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
29170 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
29180 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
29190 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
291a0 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20  dSync, pgno);.  
291b0 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
291c0 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
291d0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
291e0 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
291f0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
29200 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
29210 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
29220 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
29230 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
29240 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
29250 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
29260 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
29270 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29280 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
29290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
292a0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
292b0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
292c0 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  Pg from its hash
292d0 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
292e0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
292f0 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
29300 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
29310 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
29320 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
29330 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
29340 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
29350 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
29360 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
29370 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
29380 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
29390 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
293a0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
293b0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
293c0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
293d0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
293e0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
293f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
29400 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
29410 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
29420 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
29430 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ld ){.    assert
29440 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  ( pPgOld->nRef==
29450 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48  0 );.    unlinkH
29460 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
29470 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61   pPgOld);.    ma
29480 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b  keClean(pPgOld);
29490 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
294a0 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65  nc = pPgOld->nee
294b0 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dSync;.  }else{.
294c0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
294d0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  c = 0;.  }.  pPg
294e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  ->inJournal = sq
294f0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
29500 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29510 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  al, pgno);..  /*
29520 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
29530 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
29540 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
29550 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
29560 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  chain. */.  asse
29570 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
29580 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
29590 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  o;.  h = pgno & 
295a0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
295b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
295c0 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
295d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
295e0 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
295f0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
29600 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
29610 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
29620 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
29630 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
29640 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
29650 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
29660 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
29670 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61  vHash = 0;..  ma
29680 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
29690 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
296a0 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  he = 1;..  if( n
296b0 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
296c0 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
296d0 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
296e0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
296f0 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
29700 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
29710 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
29720 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
29730 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
29740 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
29750 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
29760 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
29770 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
29780 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
29790 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67   the .    ** Pag
297a0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
297b0 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  t has been set. 
297c0 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
297d0 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61   remedied by loa
297e0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ding.    ** the 
297f0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
29800 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
29810 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
29820 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20  needSync flag.. 
29830 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
29840 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
29850 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
29860 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
29870 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
29880 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
29890 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
298a0 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
298b0 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
298c0 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
298d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
298e0 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
298f0 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
29900 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
29910 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
29920 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
29930 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
29940 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
29950 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
29960 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
29970 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
29980 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
29990 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
299a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
299b0 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
299c0 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
299d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
299e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
299f0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
29a00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
29a10 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
29a20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
29a30 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
29a40 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
29a50 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
29a60 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  ;.    PgHdr *pPg
29a70 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
29a80 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
29a90 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
29aa0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
29ab0 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
29ac0 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
29ad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
29af0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
29b00 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65 64  nal && (int)need
29b10 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
29b20 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
29b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
29b40 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
29b50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
29b60 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20  eedSyncPgno);.  
29b70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
29b80 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
29b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29ba0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
29bb0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
29bc0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65  .    pPgHdr->nee
29bd0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
29be0 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  PgHdr->inJournal
29bf0 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69   = 1;.    makeDi
29c00 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
29c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29c20 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
29c30 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
29c40 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
29c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
29c60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
29c70 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
29c80 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
29c90 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
29ca0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
29cb0 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
29cc0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
29cd0 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
29ce0 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
29cf0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
29d00 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
29d10 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
29d20 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
29d30 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
29d40 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
29d50 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
29d60 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
29d70 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
29d80 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
29d90 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
29da0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ger;.  return (p
29db0 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45  Pager?PGHDR_TO_E
29dc0 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
29dd0 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ):0);.}../*.** G
29de0 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
29df0 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
29e00 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
29e10 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
29e20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
29e30 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
29e40 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
29e50 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
29e60 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
29e70 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
29e80 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
29e90 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
29ea0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
29eb0 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
29ec0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
29ed0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
29ee0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
29ef0 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
29f00 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
29f10 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
29f20 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
29f30 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
29f40 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
29f50 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
29f60 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
29f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29f80 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
29f90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29fa0 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
29fb0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
29fc0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
29fd0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
29fe0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
29ff0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2a000 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
2a010 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
2a020 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2a030 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2a040 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2a050 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
2a060 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2a070 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2a080 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
2a090 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2a0a0 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
2a0b0 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
2a0c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2a0d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
2a0e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d  clusiveMode = eM
2a0f0 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
2a100 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
2a110 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
2a120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2a130 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  EST./*.** Print 
2a140 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
2a150 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
2a160 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
2a170 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
2a180 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75  qlite3PagerRefdu
2a190 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
2a1a0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
2a1b0 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
2a1c0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
2a1d0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
2a1e0 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
2a1f0 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
2a200 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
2a210 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
2a220 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
2a230 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
2a240 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
2a250 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
2a260 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
2a270 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
2a280 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
2a290 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.