/ Hex Artifact Content
Login

Artifact b6a366f2343e7f127d7e70dbe76cd664336143cd:


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 36  : pager.c,v 1.46
0350: 39 20 32 30 30 38 2f 30 38 2f 30 32 20 30 33 3a  9 2008/08/02 03:
0360: 35 30 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a  50:39 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: 67 48 64 72 20 2a 70 50 72 65 76 41 6c 6c 3b 20  gHdr *pPrevAll; 
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30a0: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
30b0: 61 67 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 4c  ages */.  PagerL
30c0: 72 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20 20 20  ruLink gfree;   
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62           /* Glob
30e0: 61 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d  al list of nRef=
30f0: 3d 30 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64  =0 pages */.#end
3100: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
3110: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75  _CHECK_PAGES.  u
3120: 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e  32 pageHash;.#en
3130: 64 69 66 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  dif.  void *pDat
3140: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3150: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74       /* Page dat
3160: 61 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  a */.  /* Pager.
3170: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
3180: 6c 6f 63 61 6c 20 64 61 74 61 20 61 70 70 65 6e  local data appen
3190: 64 65 64 20 74 6f 20 74 68 69 73 20 68 65 61 64  ded to this head
31a0: 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  er */.};../*.** 
31b0: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
31c0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
31d0: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
31e0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
31f0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
3200: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
3210: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
3220: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
3230: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
3240: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
3250: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3260: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
3270: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
3280: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
3290: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
32a0: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
32b0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
32c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
32d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
32e0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
32f0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
3300: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
3310: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
3320: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
3330: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
3340: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
3350: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
3360: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
3370: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
3380: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
3390: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
33a0: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
33b0: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
33c0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
33d0: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
33e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
33f0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
3400: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
3410: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
3420: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
3430: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
3440: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
3450: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
3460: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
3470: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
3480: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
3490: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
34a0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
34b0: 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ent */.  PgHdr *
34c0: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
34d0: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
34e0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
34f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
3500: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
3510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3520: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
3530: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3540: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3550: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
3560: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
3570: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
3580: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
3590: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
35a0: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
35b0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
35c0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
35d0: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
35e0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
35f0: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
3600: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
3610: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
3620: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
3630: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
3640: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
3650: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3660: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
3670: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
3680: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
3690: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
36a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
36b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
36c0: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
36d0: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
36e0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
36f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
3700: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 20 20 28  _TO_DATA(P)    (
3710: 28 50 29 2d 3e 70 44 61 74 61 29 0a 23 64 65 66  (P)->pData).#def
3720: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
3730: 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29  RA(G,P) ((void*)
3740: 26 28 28 47 29 5b 31 5d 29 29 0a 23 64 65 66 69  &((G)[1])).#defi
3750: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
3760: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
3770: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
3780: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
3790: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e  P)[1]))[(PGR)->n
37a0: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41  Extra])../*.** A
37b0: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
37c0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
37d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37e0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
37f0: 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  * Pager.errCode 
3800: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51  may be set to SQ
3810: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
3820: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a  TE_CORRUPT, or.*
3830: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  * or SQLITE_FULL
3840: 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68  . Once one of th
3850: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72  e first three er
3860: 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20  rors occurs, it 
3870: 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20  persists.** and 
3880: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
3890: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
38a0: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
38b0: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
38c0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74   SQLITE_FULL ret
38d0: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67  urn code is slig
38e0: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20  htly different. 
38f0: 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79  It persists only
3900: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65   until the.** ne
3910: 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f  xt successful ro
3920: 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72  llback is perfor
3930: 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72  med on the pager
3940: 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a   cache. Also,.**
3950: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65   SQLITE_FULL doe
3960: 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  s not affect the
3970: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
3980: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
3990: 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41  gerLookup().** A
39a0: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
39b0: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
39c0: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72  essfully..*/.str
39d0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
3a00: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
3a10: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
3a20: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
3a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3a40: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
3a50: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
3a60: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
3a70: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
3a80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3a90: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
3aa0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
3ab0: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3ad0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3ae0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3af0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3b00: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3b10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3b20: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3b30: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b40: 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20   u8 stmtOpen;   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b60: 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74  True if the stat
3b70: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3b80: 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38   is open */.  u8
3b90: 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20   stmtInUse;     
3ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3bb0: 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  e we are in a st
3bc0: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
3bd0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73  action */.  u8 s
3be0: 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  tmtAutoopen;    
3bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
3c00: 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  stmt journal whe
3c10: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
3c20: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
3c30: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
3c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
3c50: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
3c60: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
3c70: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
3ca0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
3cb0: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
3cc0: 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b    u8 sync_flags;
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ce0: 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52   One of SYNC_NOR
3cf0: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
3d00: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
3d30: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
3d40: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
3d50: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d70: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
3d80: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
3d90: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3db0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
3dc0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
3dd0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
3e00: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
3e10: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
3e20: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63  */.  u8 dirtyCac
3e30: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  he;             
3e40: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
3e50: 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68  ed pages have ch
3e60: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c  anged */.  u8 al
3e70: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
3e80: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
3e90: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
3ea0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
3eb0: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
3ee0: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
3ef0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
3f00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
3f20: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
3f30: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
3f40: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e  */.  u8 doNotSyn
3f50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3f60: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69   /* Boolean. Whi
3f70: 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20  le true, do not 
3f80: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
3f90: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
3fa0: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
3fb0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
3fc0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
3fd0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
3fe0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
3ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4000: 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52   On of the PAGER
4010: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
4020: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 64 62  alues */.  u8 db
4030: 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20  Modified;       
4040: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4050: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
4060: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44  changes to the D
4070: 62 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  b */.  u8 change
4080: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
4090: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
40a0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
40b0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
40c0: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
40d0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
40e0: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
40f0: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
4100: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  ) */.  int errCo
4110: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
4120: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
4130: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
4140: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
4150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4160: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4170: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4180: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
4190: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
41a0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
41b0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
41c0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
41d0: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
41e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
41f0: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
4200: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
4210: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
4220: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
4230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4240: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
4250: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4260: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
4270: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
4280: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
4290: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
42a0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
42b0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
42c0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
42d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
42e0: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
42f0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
4300: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
4330: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
4340: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
4350: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4370: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
4380: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
4390: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
43b0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
43c0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
43d0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
4400: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
4410: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
4420: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4440: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4450: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
4460: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
4470: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
4480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4490: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
44a0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
44b0: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
44c0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
44d0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
44e0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
44f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4500: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
4510: 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  pInStmt;        
4520: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4530: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4540: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4550: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
4560: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4570: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
4580: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4590: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
45b0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
45c0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
45d0: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
45e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
45f0: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4600: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4610: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
4620: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
4630: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4640: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4650: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4660: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4670: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4680: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4690: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
46a0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
46b0: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
46c0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
46d0: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
46e0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
46f0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
4700: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
4710: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
4720: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
4730: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
4740: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4750: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4760: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4770: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4780: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4790: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
47a0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
47b0: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
47c0: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
47d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
47e0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
47f0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
4800: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
4810: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
4820: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
4830: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4840: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
4850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4860: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4870: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4880: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4890: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
48a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
48b0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
48c0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
48d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
48e0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
48f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
4900: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
4910: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
4920: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
4930: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4940: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
4950: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4960: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4970: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4980: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4990: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
49a0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
49b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
49c0: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
49d0: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
49e0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
49f0: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
4a00: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
4a10: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
4a20: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
4a30: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
4a40: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
4a50: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a60: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a80: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a90: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4aa0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4ab0: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4ac0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4ad0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4ae0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4af0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4b00: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4b10: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4b20: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4b30: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4b40: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4b50: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b60: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b70: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b80: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b90: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bb0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4bc0: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4bd0: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bf0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4c00: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4c10: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4c20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4c30: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4c40: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c60: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c70: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c80: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c90: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4cb0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4cc0: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4cd0: 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e  */.  volatile in
4ce0: 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20  t iInUseMM;     
4cf0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4d00: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4d10: 4d 20 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20  M */.  volatile 
4d20: 69 6e 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20  int iInUseDB;   
4d30: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d40: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4d50: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d60: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d70: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d90: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4da0: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4db0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4dc0: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4dd0: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4de0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4df0: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4e00: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4e10: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
4e20: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
4e30: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
4e40: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a  nal files */.};.
4e50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4e60: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
4e70: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
4e80: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
4e90: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
4ea0: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
4eb0: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
4ec0: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
4ed0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
4ee0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4ef0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
4f00: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
4f10: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4f20: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
4f30: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
4f40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4f50: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
4f60: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
4f70: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4f80: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
4f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4fa0: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
4fb0: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
4fc0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4fd0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
4fe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4ff0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
5000: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
5010: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
5020: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
5030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5040: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
5050: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
5060: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
5070: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
5080: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
5090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
50a0: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
50b0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
50c0: 68 65 61 64 20 6f 66 20 61 20 64 6f 75 62 6c 65  head of a double
50d0: 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20  -linked list.** 
50e0: 6f 66 20 61 6c 6c 20 70 61 67 65 72 73 20 74 68  of all pagers th
50f0: 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20  at are eligible 
5100: 66 6f 72 20 70 61 67 65 20 73 74 65 61 6c 69 6e  for page stealin
5110: 67 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69  g by the.** sqli
5120: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
5130: 72 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ry() interface. 
5140: 20 41 63 63 65 73 73 20 74 6f 20 74 68 69 73 20   Access to this 
5150: 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65  list is.** prote
5160: 63 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  cted by the SQLI
5170: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5180: 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23  MEM2 mutex..*/.#
5190: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
51a0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
51b0: 45 4d 45 4e 54 0a 73 74 61 74 69 63 20 50 61 67  EMENT.static Pag
51c0: 65 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  er *sqlite3Pager
51d0: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
51e0: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 73 71   PagerLruList sq
51f0: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
5200: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65   = {0, 0, 0};.#e
5210: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  ndif.../*.** Jou
5220: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
5230: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
5240: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
5250: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
5260: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
5270: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
5280: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
5290: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
52a0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
52b0: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
52c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
52d0: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
52e0: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
52f0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
5300: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
5310: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
5320: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
5330: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
5340: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
5350: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
5360: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
5370: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
5380: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
5390: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
53a0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
53b0: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
53c0: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
53d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
53e0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
53f0: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
5400: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
5410: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
5420: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
5430: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
5440: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
5450: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
5460: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
5470: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
5480: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
5490: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
54a0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
54b0: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
54c0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
54d0: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
54e0: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
54f0: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
5500: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
5510: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
5520: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
5530: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
5540: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
5550: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
5560: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
5570: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
5580: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
5590: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
55a0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
55b0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
55c0: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
55d0: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
55e0: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
55f0: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
5600: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
5610: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
5620: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
5630: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
5640: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
5650: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
5660: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
5670: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
5680: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
5690: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
56a0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
56b0: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
56c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
56d0: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
56e0: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
56f0: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
5700: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
5710: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
5720: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
5730: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
5740: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
5750: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
5760: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
5770: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
5780: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
5790: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
57a0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
57b0: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
57c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
57d0: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
57e0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
57f0: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
5800: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
5810: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
5820: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
5830: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
5840: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
5850: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
5860: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
5870: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
5880: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
5890: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
58a0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
58b0: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
58c0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
58d0: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
58e0: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
58f0: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
5900: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
5910: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5920: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
5930: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
5940: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
5950: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
5960: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
5970: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5980: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
5990: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
59a0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
59b0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
59c0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
59d0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
59e0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
59f0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
5a00: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
5a10: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
5a20: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
5a30: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
5a40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5a50: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
5a60: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
5a70: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
5a80: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
5a90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
5aa0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
5ab0: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
5ac0: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
5ad0: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
5ae0: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
5af0: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
5b00: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
5b10: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
5b20: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
5b30: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
5b40: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
5b50: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
5b60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
5b70: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
5b80: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
5b90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5ba0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
5bb0: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
5bc0: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
5bd0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
5be0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
5bf0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5c00: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
5c10: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
5c20: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
5c30: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5c40: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
5c50: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5c60: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
5c70: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
5c80: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
5c90: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
5ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
5cb0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
5cc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
5cd0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
5ce0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
5cf0: 72 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67  rEnter() and pag
5d00: 65 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e  erLeave() routin
5d10: 65 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72  es acquire and r
5d20: 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65  elease.** a mute
5d30: 78 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e  x on each pager.
5d40: 20 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72    The mutex is r
5d50: 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  ecursive..**.** 
5d60: 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
5d70: 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e  l-purpose mutex.
5d80: 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64    It only provid
5d90: 65 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73  es mutual exclus
5da0: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  ion.** between t
5db0: 68 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65  he Btree and the
5dc0: 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65   Memory Manageme
5dd0: 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  nt sqlite3_relea
5de0: 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66  se_memory().** f
5df0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65  unction.  It doe
5e00: 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66  s not prevent, f
5e10: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20  or example, two 
5e20: 42 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65  Btrees from acce
5e30: 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d  ssing.** the sam
5e40: 65 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73  e pager at the s
5e50: 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72  ame time.  Other
5e60: 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
5e70: 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74   mutexes in.** t
5e80: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68  he btree layer h
5e90: 61 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65  andle that chore
5ea0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5eb0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
5ec0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74  _MANAGEMENT.  st
5ed0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45  atic void pagerE
5ee0: 6e 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a  nter(Pager *p){.
5ef0: 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b      p->iInUseDB+
5f00: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49  +;.    if( p->iI
5f10: 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e  nUseMM && p->iIn
5f20: 55 73 65 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e  UseDB==1 ){.#ifn
5f30: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
5f40: 5f 4e 4f 4f 50 0a 20 20 20 20 20 20 73 71 6c 69  _NOOP.      sqli
5f50: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5f60: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5f70: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
5f80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
5f90: 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e  TATIC_MEM2);.#en
5fa0: 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e  dif.      p->iIn
5fb0: 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20  UseDB = 0;.     
5fc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5fd0: 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
5fe0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d     p->iInUseDB =
5ff0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
6000: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
6010: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
6020: 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73  assert( p->iInUs
6030: 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  eMM==0 );.  }.  
6040: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
6050: 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29  rLeave(Pager *p)
6060: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
6070: 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B--;.    assert(
6080: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20   p->iInUseDB>=0 
6090: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64  );.  }.#else.# d
60a0: 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72  efine pagerEnter
60b0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67  (X).# define pag
60c0: 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69  erLeave(X).#endi
60d0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67  f../*.** Add pag
60e0: 65 20 70 50 67 20 74 6f 20 74 68 65 20 65 6e 64  e pPg to the end
60f0: 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
6100: 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ist managed by s
6110: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73  tructure.** pLis
6120: 74 20 28 70 50 67 20 62 65 63 6f 6d 65 73 20 74  t (pPg becomes t
6130: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
6140: 20 74 68 65 20 6c 69 73 74 20 2d 20 74 68 65 20   the list - the 
6150: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
6160: 2a 20 75 73 65 64 29 2e 20 41 72 67 75 6d 65 6e  * used). Argumen
6170: 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70  t pLink should p
6180: 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70  oint to either p
6190: 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d  Pg->free or pPg-
61a0: 3e 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e  >gfree,.** depen
61b0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
61c0: 70 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64  pPg is being add
61d0: 65 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d  ed to the pager-
61e0: 73 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67  specific or.** g
61f0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a  lobal LRU list..
6200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6210: 69 73 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c  istAdd(PagerLruL
6220: 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65  ist *pList, Page
6230: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c  rLruLink *pLink,
6240: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
6250: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30  pLink->pNext = 0
6260: 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  ;.  pLink->pPrev
6270: 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b   = pList->pLast;
6280: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6290: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
62a0: 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72  NAGEMENT.  asser
62b0: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66  t(pLink==&pPg->f
62c0: 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70  ree || pLink==&p
62d0: 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73  Pg->gfree);.  as
62e0: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
62f0: 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74  ->gfree || pList
6300: 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  !=&sqlite3LruPag
6310: 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  eList);.#endif..
6320: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61    if( pList->pLa
6330: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  st ){.    int iO
6340: 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69  ff = (char *)pLi
6350: 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67  nk - (char *)pPg
6360: 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  ;.    PagerLruLi
6370: 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20  nk *pLastLink = 
6380: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
6390: 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e  (&((u8 *)pList->
63a0: 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20  pLast)[iOff]);. 
63b0: 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e     pLastLink->pN
63c0: 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c  ext = pPg;.  }el
63d0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21  se{.    assert(!
63e0: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a  pList->pFirst);.
63f0: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
6400: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20  t = pPg;.  }..  
6410: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70  pList->pLast = p
6420: 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73 74  Pg;.  if( !pList
6430: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 26  ->pFirstSynced &
6440: 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  & pPg->needSync=
6450: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  =0 ){.    pList-
6460: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6470: 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pPg;.  }.}../*.*
6480: 2a 20 52 65 6d 6f 76 65 20 70 50 67 20 66 72 6f  * Remove pPg fro
6490: 6d 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  m the list manag
64a0: 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ed by the struct
64b0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
64c0: 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  y pList..**.** A
64d0: 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68  rgument pLink sh
64e0: 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69  ould point to ei
64f0: 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f  ther pPg->free o
6500: 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 20 64 65  r pPg->gfree, de
6510: 70 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77  pending .** on w
6520: 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65  hether pPg is be
6530: 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
6540: 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20   pager-specific 
6550: 6f 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  or global LRU li
6560: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6570: 69 64 20 6c 69 73 74 52 65 6d 6f 76 65 28 50 61  id listRemove(Pa
6580: 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73  gerLruList *pLis
6590: 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  t, PagerLruLink 
65a0: 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70  *pLink, PgHdr *p
65b0: 50 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20  Pg){.  int iOff 
65c0: 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20  = (char *)pLink 
65d0: 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a  - (char *)pPg;..
65e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
65f0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6600: 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28  GEMENT.  assert(
6610: 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65  pLink==&pPg->fre
6620: 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67  e || pLink==&pPg
6630: 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65  ->gfree);.  asse
6640: 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  rt(pLink==&pPg->
6650: 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d  gfree || pList!=
6660: 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  &sqlite3LruPageL
6670: 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ist);.#endif..  
6680: 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e  if( pPg==pList->
6690: 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70 4c  pFirst ){.    pL
66a0: 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c  ist->pFirst = pL
66b0: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
66c0: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
66d0: 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  ->pLast ){.    p
66e0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c  List->pLast = pL
66f0: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
6700: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72    if( pLink->pPr
6710: 65 76 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  ev ){.    PagerL
6720: 72 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e  ruLink *pPrevLin
6730: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
6740: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
6750: 6e 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d  nk->pPrev)[iOff]
6760: 29 3b 0a 20 20 20 20 70 50 72 65 76 4c 69 6e 6b  );.    pPrevLink
6770: 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d  ->pNext = pLink-
6780: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
6790: 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29  ( pLink->pNext )
67a0: 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  {.    PagerLruLi
67b0: 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20  nk *pNextLink = 
67c0: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
67d0: 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e  (&((u8 *)pLink->
67e0: 70 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20  pNext)[iOff]);. 
67f0: 20 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50     pNextLink->pP
6800: 72 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  rev = pLink->pPr
6810: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ev;.  }.  if( pP
6820: 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  g==pList->pFirst
6830: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
6840: 48 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e  Hdr *p = pLink->
6850: 70 4e 65 78 74 3b 0a 20 20 20 20 77 68 69 6c 65  pNext;.    while
6860: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
6870: 6e 63 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  nc ){.      Page
6880: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28  rLruLink *pL = (
6890: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
68a0: 26 28 28 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d  &((u8 *)p)[iOff]
68b0: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4c 2d  );.      p = pL-
68c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
68d0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53    pList->pFirstS
68e0: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
68f0: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
6900: 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20   pLink->pPrev = 
6910: 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64  0;.}../* .** Add
6920: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
6930: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6940: 67 65 73 20 66 6f 72 20 74 68 65 20 70 61 67 65  ges for the page
6950: 72 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79  r. If .** memory
6960: 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
6970: 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64  nabled, also add
6980: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
6990: 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74   global .** list
69a0: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a   of free pages..
69b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
69c0: 72 75 4c 69 73 74 41 64 64 28 50 67 48 64 72 20  ruListAdd(PgHdr 
69d0: 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64  *pPg){.  listAdd
69e0: 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c  (&pPg->pPager->l
69f0: 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20  ru, &pPg->free, 
6a00: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
6a10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6a20: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
6a30: 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d  f( !pPg->pPager-
6a40: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
6a50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6a60: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
6a70: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6a80: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6a90: 20 20 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69     listAdd(&sqli
6aa0: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20  te3LruPageList, 
6ab0: 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67  &pPg->gfree, pPg
6ac0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6ad0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6ae0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
6af0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6b00: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6b10: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d  if.}../* .** Rem
6b20: 6f 76 65 20 70 61 67 65 20 70 50 67 20 66 72 6f  ove page pPg fro
6b30: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  m the list of fr
6b40: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
6b50: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
6b60: 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d  r..** If memory-
6b70: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6b80: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f  abled, also remo
6b90: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6ba0: 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f  global list.** o
6bb0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6bd0: 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72  ListRemove(PgHdr
6be0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65   *pPg){.  listRe
6bf0: 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65  move(&pPg->pPage
6c00: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6c10: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6c20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6c30: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6c40: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6c50: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6c60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6c70: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
6c80: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
6c90: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6ca0: 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76  );.    listRemov
6cb0: 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  e(&sqlite3LruPag
6cc0: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6cd0: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6ce0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6cf0: 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
6d00: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6d10: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6d20: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
6d30: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6d40: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  n is called just
6d50: 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64 53   after the needS
6d60: 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  ync flag has bee
6d70: 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f  n cleared.** fro
6d80: 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61  m all pages mana
6d90: 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28 75  ged by pPager (u
6da0: 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74  sually because t
6db0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
6dc0: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
6dd0: 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64   synced). It upd
6de0: 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72 2d  ates the pPager-
6df0: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6e00: 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e  d variable.** an
6e10: 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  d, if memory-man
6e20: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6e30: 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c  ed, the sqlite3L
6e40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6e50: 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61  tSynced.** varia
6e60: 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61  ble also..*/.sta
6e70: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6e80: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 50  SetFirstSynced(P
6e90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6ea0: 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
6eb0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
6ec0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
6ed0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6ee0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6ef0: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
6f00: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
6f10: 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
6f20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6f30: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
6f40: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
6f50: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6f60: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
6f70: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6f80: 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e  First; p && p->n
6f90: 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66  eedSync; p=p->gf
6fa0: 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20  ree.pNext);.    
6fb0: 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72  assert(p==pPager
6fc0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
6fd0: 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33  ed || p==sqlite3
6fe0: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
6ff0: 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73  stSynced);.    s
7000: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
7010: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  t.pFirstSynced =
7020: 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   p;.    sqlite3_
7030: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
7040: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
7050: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7060: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
7070: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
7080: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
7090: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
70a0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
70b0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
70c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
70d0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
70e0: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
70f0: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7100: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7110: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7130: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7140: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7150: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7160: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7170: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
7180: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
7190: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
71a0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
71b0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
71c0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
71d0: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
71e0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
71f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7200: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7210: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
7220: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
7230: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
7240: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
7250: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
7260: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
7270: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7280: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
7290: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
72a0: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
72b0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66 64  N-1))==0 );.#ifd
72c0: 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43  ef SQLITE_MALLOC
72d0: 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69 66  _SOFT_LIMIT.  if
72e0: 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73 68  ( N*sizeof(aHash
72f0: 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c 4c  [0])>SQLITE_MALL
7300: 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29 7b  OC_SOFT_LIMIT ){
7310: 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45 5f  .    N = SQLITE_
7320: 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49  MALLOC_SOFT_LIMI
7330: 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  T/sizeof(aHash[0
7340: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 3d  ]);.  }.  if( N=
7350: 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
7360: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
7370: 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
7380: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
7390: 65 72 2d 3e 61 48 61 73 68 21 3d 30 20 29 20 73  er->aHash!=0 ) s
73a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
73b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 61 48 61  nMalloc();.  aHa
73c0: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
73d0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
73e0: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
73f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
7400: 68 21 3d 30 20 29 20 73 71 6c 69 74 65 33 45 6e  h!=0 ) sqlite3En
7410: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
7420: 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
7430: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61  ager);.  if( aHa
7440: 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  sh==0 ){.    /* 
7450: 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73  Failure to rehas
7460: 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f  h is not an erro
7470: 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61  r.  It is only a
7480: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
7490: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
74a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
74b0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
74c0: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48  h);.  pPager->nH
74d0: 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65  ash = N;.  pPage
74e0: 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68  r->aHash = aHash
74f0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
7500: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7510: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
7520: 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  ){.    int h;.  
7530: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
7540: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
7550: 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
7560: 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
7570: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
7580: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7590: 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d    }.    h = pPg-
75a0: 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20  >pgno & (N-1);. 
75b0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
75c0: 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20  h = aHash[h];.  
75d0: 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29    if( aHash[h] )
75e0: 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d  {.      aHash[h]
75f0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
7600: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61  g;.    }.    aHa
7610: 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
7620: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
7630: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
7640: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
7650: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
7660: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
7670: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
7680: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
7690: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
76a0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
76b0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
76c0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
76d0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
76e0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
76f0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
7700: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
7710: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
7720: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
7730: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
7740: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
7750: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
7760: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
7770: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7780: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
7790: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
77a0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
77b0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
77c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
77d0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
77e0: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
77f0: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
7800: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
7810: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
7820: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
7830: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
7840: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
7850: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
7860: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
7870: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
7880: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
7890: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
78a0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
78b0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
78c0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
78d0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
78e0: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
78f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
7900: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7920: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
7930: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
7940: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
7950: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
7960: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
7970: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
7980: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7990: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
79a0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  t);.}../*.** If 
79b0: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
79c0: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
79d0: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
79e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
79f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
7a00: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
7a10: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64  ock){.  if( !pFd
7a20: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
7a30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a40: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
7a50: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
7a60: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
7a70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7a80: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
7a90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7aa0: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
7ab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
7ac0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
7ad0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
7ae0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
7af0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
7b00: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
7b10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7b20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7b30: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
7b40: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
7b50: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
7b60: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
7b70: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
7b80: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
7b90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
7ba0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
7bb0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
7bc0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
7bd0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
7be0: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
7bf0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
7c00: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
7c10: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
7c20: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
7c30: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7c40: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
7c50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7c60: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
7c70: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
7c80: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
7c90: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
7ca0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7cb0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
7cc0: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
7cd0: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
7ce0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
7cf0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dc;           /*
7d00: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
7d10: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  ristics */.  int
7d20: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f   nSector;      /
7d30: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
7d40: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20  .  int szPage;  
7d50: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
7d60: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ze */.  sqlite3_
7d70: 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
7d80: 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64  r->fd;..  if( fd
7d90: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
7da0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
7db0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7dc0: 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e  stics(fd);.    n
7dd0: 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Sector = sqlite3
7de0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29  OsSectorSize(fd)
7df0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
7e00: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e10: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e20: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e30: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7e40: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7e50: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7e60: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7e70: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7e80: 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20  hods || .       
7e90: 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f  (dc & (SQLITE_IO
7ea0: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
7eb0: 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74  ge>>8)) && nSect
7ec0: 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20  or<=szPage) ){. 
7ed0: 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41     return JOURNA
7ee0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7ef0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
7f00: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7f10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
7f20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
7f30: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
7f40: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
7f50: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
7f60: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
7f70: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
7f80: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
7f90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7fa0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
7fb0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
7fc0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
7fd0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
7fe0: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
7ff0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
8000: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
8010: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
8020: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8030: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
8040: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
8050: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8060: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
8070: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
8080: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
8090: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
80a0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
80b0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
80c0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
80d0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
80e0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
80f0: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
8100: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
8110: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
8120: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
8130: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
8140: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
8150: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
8160: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
8170: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
8180: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
8190: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
81a0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
81b0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
81c0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
81d0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
81e0: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
81f0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
8200: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
8210: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
8220: 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74   occured, then t
8230: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
8240: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
8250: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a  to be replayed..
8260: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8270: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
8280: 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74  r *pPager);.stat
8290: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
82a0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
82b0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
82c0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
82d0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
82e0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
82f0: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
8300: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
8310: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
8320: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
8330: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8340: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
8350: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
8360: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
8370: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
8380: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
8390: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
83a0: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
83b0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
83c0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
83d0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
83e0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20  PAGER_UNLOCK && 
83f0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
8400: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
8410: 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
8420: 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61  ady unlocked, ca
8430: 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ll pager_unlock(
8440: 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a  ) now to.      *
8450: 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  * clear the erro
8460: 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75  r state and ensu
8470: 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
8480: 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20  r-cache is .    
8490: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20    ** completely 
84a0: 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  empty..      */.
84b0: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
84c0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
84d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
84e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
84f0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8500: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
8510: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
8520: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
8530: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
8540: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
8550: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
8560: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
8570: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
8580: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
8590: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
85a0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
85b0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
85c0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
85d0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
85e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
85f0: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
8600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8610: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
8620: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
8630: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
8640: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
8650: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
8660: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
8670: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
8680: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
8690: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
86a0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
86b0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
86c0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
86d0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20  r->pageSize, .  
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20        (unsigned 
8700: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
8710: 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a  DATA(pPage));.}.
8720: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
8730: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
8740: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
8750: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
8760: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8770: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
8780: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
8790: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
87a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
87b0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
87c0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
87d0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
87e0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
87f0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
8800: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
8810: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
8820: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
8830: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
8840: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
8850: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
8860: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
8870: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
8880: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
8890: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
88a0: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
88b0: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
88c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
88d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
88e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
88f0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
8900: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
8910: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
8920: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
8930: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
8940: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
8950: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
8960: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
8970: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
8980: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
8990: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
89a0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
89b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
89c0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
89d0: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
89e0: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
89f0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
8a00: 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20   .**.** zMaster 
8a10: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
8a20: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
8a30: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
8a40: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
8a50: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
8a60: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
8a70: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
8a80: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
8a90: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
8aa0: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
8ab0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8ac0: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
8ad0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8ae0: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
8af0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
8b00: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
8b10: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
8b20: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
8b30: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
8b40: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
8b50: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
8b60: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
8b70: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
8b80: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
8b90: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
8ba0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
8bb0: 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72   present zMaster
8bc0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
8bd0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
8be0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
8bf0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
8c00: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
8c10: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
8c20: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69  char *zMaster, i
8c30: 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  nt nMaster){.  i
8c40: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
8c50: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75  ;.  i64 szJ;.  u
8c60: 33 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20  32 cksum;.  u32 
8c70: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
8c80: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
8c90: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
8ca0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8cb0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
8cc0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
8cd0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
8ce0: 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30   */..  zMaster[0
8cf0: 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20  ] = '\0';..  rc 
8d00: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
8d10: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
8d20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d30: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
8d40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8d50: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8d60: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
8d70: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
8d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
8d90: 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65  rn rc;..  if( le
8da0: 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20  n>=nMaster ){.  
8db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8dc0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
8dd0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
8de0: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
8df0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8e00: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8e10: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
8e20: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
8e30: 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d   aMagic, 8, szJ-
8e40: 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  8);.  if( rc!=SQ
8e50: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
8e60: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
8e70: 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65  alMagic, 8) ) re
8e80: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8e90: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
8ea0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
8eb0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b  en, szJ-16-len);
8ec0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8ed0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
8ee0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61  rn rc;.  }.  zMa
8ef0: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
8f00: 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  ;..  /* See if t
8f10: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
8f20: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
8f30: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
8f40: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
8f50: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
8f60: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
8f70: 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d     }.  if( cksum
8f80: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
8f90: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
8fa0: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
8fb0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
8fc0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
8fd0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
8fe0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
8ff0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
9000: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
9010: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
9020: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
9030: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
9040: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
9050: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
9060: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
9070: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
9080: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
9090: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  er[0] = '\0';.  
90a0: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
90b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
90c0: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
90d0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
90e0: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
90f0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
9100: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
9110: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
9120: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
9130: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
9140: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
9150: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
9160: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
9170: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
9180: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
9190: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
91a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
91b0: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
9270: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
9280: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
9290: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
92a0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
92b0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
92c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
92d0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
92e0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
92f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9300: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
9310: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9320: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9330: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
9340: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
9350: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
9360: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
9370: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
9380: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9390: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
93a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
93b0: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
93c0: 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f 76  * Write zeros ov
93d0: 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  er the header of
93e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
93f0: 65 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65  e.  This has the
9400: 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69 6e  .** effect of in
9410: 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 6a  validating the j
9420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
9430: 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a  committing the.*
9440: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  * transaction..*
9450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
9460: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
9470: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
9480: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
9490: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
94a0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
94b0: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
94c0: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ];..  if( pPager
94d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
94e0: 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d      i64 iLimit =
94f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9500: 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20  SizeLimit;..    
9510: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
9520: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
9530: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
9540: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
9550: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
9560: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
9570: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9580: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
9590: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
95a0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
95b0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
95c0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
95d0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
95e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
95f0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
9600: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
9610: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
9620: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
9630: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
9640: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
9650: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
9660: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
9670: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
9680: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
9690: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
96a0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
96b0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
96c0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
96d0: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
96e0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
96f0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
9700: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
9710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9720: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
9730: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
9740: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
9750: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
9760: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
9770: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
9780: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
9790: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
97a0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
97b0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
97c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
97d0: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
97e0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
97f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9800: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
9810: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
9820: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9830: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
9840: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
9850: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
9860: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
9870: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
9880: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9890: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
98a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
98b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
98c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
98d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
98e0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
98f0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
9900: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
9910: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
9920: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
9930: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
9940: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
9950: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
9960: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9970: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
9980: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
9990: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
99a0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
99b0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
99c0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
99d0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
99e0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
99f0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
9a00: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
9a10: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
9a20: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
9a30: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
9a40: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
9a50: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
9a60: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
9a70: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
9a80: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
9a90: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
9aa0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
9ab0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
9ac0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
9ad0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9ae0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
9af0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
9b00: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
9b10: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
9b20: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
9b30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
9b40: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
9b50: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
9b60: 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20  ;.  int nHeader 
9b70: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
9b80: 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65  ze;.  int nWrite
9b90: 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  ;..  if( nHeader
9ba0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
9bb0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
9bc0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
9bd0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
9be0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
9bf0: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
9c00: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
9c10: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
9c20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9c30: 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75  ;.  }..  seekJou
9c40: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
9c50: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9c60: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
9c70: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d  journalOff;..  m
9c80: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
9c90: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
9ca0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9cb0: 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ic));..  /* .  *
9cc0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
9cd0: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
9ce0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
9cf0: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
9d00: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
9d10: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
9d20: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
9d30: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
9d40: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
9d50: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
9d60: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
9d70: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9d80: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
9d90: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
9da0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
9db0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
9dc0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
9dd0: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
9de0: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
9df0: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
9e00: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
9e10: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
9e20: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
9e30: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
9e40: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
9e50: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
9e60: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
9e70: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
9e80: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
9e90: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
9ea0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
9eb0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9ec0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9ed0: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
9ee0: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
9ef0: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
9f00: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20  failure occured 
9f10: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
9f20: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9f30: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
9f40: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
9f50: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
9f60: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
9f70: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
9f80: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
9f90: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
9fa0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
9fb0: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
9fc0: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
9fd0: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
9fe0: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
9ff0: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
a000: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
a010: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
a020: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
a030: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
a040: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
a050: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
a060: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
a070: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
a080: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
a090: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
a0a0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
a0b0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
a0c0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a  Pager->noSync);.
a0d0: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e    if( (pPager->n
a0e0: 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73  oSync) .   || (s
a0f0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
a100: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
a110: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
a120: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
a130: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
a140: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
a150: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a160: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
a170: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
a180: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
a190: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
a1a0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
a1b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
a1c0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
a1d0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
a1e0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
a1f0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
a200: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
a210: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
a220: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
a230: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
a240: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
a250: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
a260: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
a270: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
a280: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
a290: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
a2a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a2b0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
a2c0: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
a2d0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
a2e0: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
a2f0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
a300: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
a310: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a320: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
a330: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
a340: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
a350: 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b  journalHdr==0 ){
a360: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
a370: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74   size */.    put
a380: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
a390: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
a3a0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
a3b0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a3c0: 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  }..  for(nWrite=
a3d0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
a3e0: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
a3f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
a400: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
a410: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
a420: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
a430: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
a440: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
a450: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
a460: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
a470: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
a480: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
a490: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
a4a0: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
a4b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a4c0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
a4d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a4e0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
a4f0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
a500: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
a510: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
a520: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
a530: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
a540: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
a550: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
a560: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
a570: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
a580: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
a590: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
a5a0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
a5b0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
a5c0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
a5d0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
a5e0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
a5f0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
a600: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
a610: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
a620: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
a630: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
a640: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
a650: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
a660: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
a670: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
a680: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a690: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a6a0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a6b0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a6c0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a6d0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a6e0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a6f0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a700: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a710: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a720: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a730: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a740: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a750: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a760: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a770: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a780: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a790: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a7a0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a7b0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a7c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a7d0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a7e0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a7f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a800: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a810: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a820: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a830: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a840: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a850: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a860: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a870: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a880: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a890: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a8a0: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a8b0: 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69  f;.  int iPageSi
a8c0: 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e  ze;..  seekJourn
a8d0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
a8e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
a8f0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
a900: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
a910: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
a920: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a930: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72  E_DONE;.  }.  jr
a940: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
a950: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72  journalOff;..  r
a960: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a970: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
a980: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
a990: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
a9a0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a9b0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
a9c0: 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69   += sizeof(aMagi
a9d0: 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  c);..  if( memcm
a9e0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
a9f0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
aa00: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
aa10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aa20: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
aa30: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
aa40: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
aa50: 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66  ff, pNRec);.  if
aa60: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
aa70: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
aa80: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
aa90: 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50  , jrnlOff+4, &pP
aaa0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
aab0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
aac0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
aad0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
aae0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
aaf0: 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  8, pDbSize);.  i
ab00: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ab10: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
ab20: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
ab30: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28  d, jrnlOff+16, (
ab40: 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65  u32 *)&iPageSize
ab50: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
ab60: 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50  ITE_OK .   && iP
ab70: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20  ageSize>=512 .  
ab80: 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53   && iPageSize<=S
ab90: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
aba0: 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50 61  IZE .   && ((iPa
abb0: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
abc0: 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ize)==0 .  ){.  
abd0: 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d    u16 pagesize =
abe0: 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20   iPageSize;.    
abf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ac00: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
ac10: 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b  ger, &pagesize);
ac20: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
ac30: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
ac40: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
ac50: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
ac60: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
ac70: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
ac80: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ac90: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
aca0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
acb0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
acc0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
acd0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
ace0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
acf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
ad00: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
ad10: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
ad20: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
ad30: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
ad40: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
ad50: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
ad60: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
ad70: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
ad80: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
ad90: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ada0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
adb0: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
adc0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
add0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ade0: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
adf0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
ae00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
ae10: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
ae20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
ae30: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
ae40: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
ae50: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
ae60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ae70: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
ae80: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
ae90: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
aea0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aeb0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
aec0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
aed0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
aee0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
aef0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
af00: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
af10: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
af20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
af30: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
af40: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
af50: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
af60: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
af70: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
af80: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
af90: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
afa0: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
afb0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
afc0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
afd0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
afe0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
aff0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b000: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
b010: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
b020: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
b030: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
b040: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
b050: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
b060: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
b070: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
b080: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
b090: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
b0a0: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
b0b0: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
b0c0: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
b0d0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
b0e0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
b0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b100: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
b110: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
b120: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
b130: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
b140: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
b150: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
b160: 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c  lOff;.  i64 jrnl
b170: 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73 75  Size;.  u32 cksu
b180: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
b190: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
b1a0: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
b1b0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
b1c0: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
b1d0: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
b1e0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
b1f0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
b200: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
b210: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
b220: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
b230: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
b240: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
b250: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
b260: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
b270: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
b280: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
b290: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
b2a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b2b0: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
b2c0: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
b2d0: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
b2e0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
b2f0: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
b300: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
b310: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
b320: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
b330: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
b340: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
b350: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
b360: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
b370: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b380: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
b390: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
b3a0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
b3b0: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
b3c0: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
b3d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b3e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b3f0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
b400: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
b410: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b420: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
b430: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
b440: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b450: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b460: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
b470: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
b480: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
b490: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
b4a0: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
b4b0: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
b4c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
b4d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
b4e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
b4f0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b500: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
b510: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b520: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
b530: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69   jrnlOff += 8+si
b540: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b550: 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ic);.  pPager->n
b560: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
b570: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
b580: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
b590: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
b5a0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
b5b0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
b5c0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
b5d0: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
b5e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b5f0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b600: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
b610: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
b620: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
b630: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
b640: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
b650: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
b660: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
b670: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
b680: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
b690: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
b6a0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
b6b0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
b6c0: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
b6d0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
b6e0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
b6f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
b700: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
b710: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
b720: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
b730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
b740: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
b750: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
b760: 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51  / .  if( (rc==SQ
b770: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28  LITE_OK).   && (
b780: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
b790: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
b7a0: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d  fd, &jrnlSize))=
b7b0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
b7c0: 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66   jrnlSize>jrnlOf
b7d0: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
b7e0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b7f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  e(pPager->jfd, j
b800: 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  rnlOff);.  }.  r
b810: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b820: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
b830: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
b840: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
b850: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
b860: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
b870: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
b880: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
b890: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
b8a0: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
b8b0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
b8c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b8d0: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
b8e0: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50  lps the sqlite3P
b8f0: 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29  agerStmtCommit()
b900: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
b910: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
b920: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
b930: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
b940: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
b950: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
b960: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
b970: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
b980: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
b990: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
b9a0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
b9b0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
b9c0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
b9d0: 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72  ager;.  PgHistor
b9e0: 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
b9f0: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
ba00: 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
ba10: 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20   MEMDB );.  if( 
ba20: 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29  !pHist->inStmt )
ba30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48  {.    assert( pH
ba40: 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  ist->pPrevStmt==
ba50: 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78  0 && pHist->pNex
ba60: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tStmt==0 );.    
ba70: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
ba80: 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52  t ){.      PGHDR
ba90: 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d  _TO_HIST(pPager-
baa0: 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d  >pStmt, pPager)-
bab0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
bac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73  ;.    }.    pHis
bad0: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
bae0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20  Pager->pStmt;.  
baf0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
bb00: 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74  = pPg;.    pHist
bb10: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
bb20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  }.}../*.** Find 
bb30: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
bb40: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
bb50: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
bb60: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
bb70: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
bb80: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
bb90: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
bba0: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
bbb0: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
bbc0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
bbd0: 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66    PgHdr *p;.  if
bbe0: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d  ( pPager->aHash=
bbf0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
bc00: 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61   p = pPager->aHa
bc10: 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65  sh[pgno & (pPage
bc20: 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20  r->nHash-1)];.  
bc30: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70  while( p && p->p
bc40: 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  gno!=pgno ){.   
bc50: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73   p = p->pNextHas
bc60: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
bc70: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  p;.}../*.** Clea
bc80: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
bc90: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
bca0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
bcb0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
bcc0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
bcd0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
bce0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
bcf0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
bd00: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
bd10: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
bd20: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
bd30: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
bd40: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
bd50: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
bd60: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
bd70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
bd80: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
bd90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
bda0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
bdb0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bdc0: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
bdd0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
bde0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
bdf0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54  =pNext){.    IOT
be00: 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
be10: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
be20: 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
be30: 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
be40: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
be50: 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65  _count);.    pNe
be60: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
be70: 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52  ll;.    lruListR
be80: 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20  emove(pPg);.    
be90: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
bea0: 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
beb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
bec0: 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  g);.  }.  assert
bed0: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
bee0: 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72  rst==0);.  asser
bef0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
bf00: 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a  irstSynced==0);.
bf10: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
bf20: 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a  >lru.pLast==0);.
bf30: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
bf40: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
bf50: 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  All = 0;.  pPage
bf60: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
bf70: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
bf80: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
bf90: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
bfa0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
bfb0: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
bfc0: 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70  ->aHash = 0;.  p
bfd0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
bfe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
bff0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c000: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
c010: 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
c020: 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74  ntly in error st
c030: 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65  ate, discard the
c040: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a   contents of .**
c050: 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
c060: 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73  eset the Pager s
c070: 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61  tructure interna
c080: 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72  l state. If ther
c090: 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20  e is.** an open 
c0a0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68  journal-file, th
c0b0: 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  en the next time
c0c0: 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
c0d0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e  s obtained.** on
c0e0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
c0f0: 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20  (by this or any 
c100: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20  other process), 
c110: 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72  it will be.** tr
c120: 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a  eated as a hot-j
c130: 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
c140: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
c150: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
c160: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
c170: 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
c180: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
c190: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   ){.    if( !MEM
c1a0: 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  DB ){.      int 
c1b0: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
c1c0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
c1d0: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
c1e0: 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   ) pPager->errCo
c1f0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70  de = rc;.      p
c200: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c210: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
c220: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
c230: 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
c240: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
c250: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
c260: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
c270: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
c280: 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68  ck..      ** Oth
c290: 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20  erwise, another 
c2a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
c2b0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
c2c0: 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20  ete might.      
c2d0: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
c2e0: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
c2f0: 72 20 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  r us..      */. 
c300: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
c310: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
c320: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
c330: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
c340: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  fd);.        pPa
c350: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c360: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
c370: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
c380: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
c390: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
c3a0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
c3b0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  al = 0;.      }.
c3c0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 50 61 67  .      /* If Pag
c3d0: 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65  er.errCode is se
c3e0: 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
c3f0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
c400: 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20  he cannot be.   
c410: 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e     ** trusted. N
c420: 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ow that the page
c430: 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  r file is unlock
c440: 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ed, the contents
c450: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c460: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
c470: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
c480: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
c490: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  y cleared..     
c4a0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
c4b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
c4c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
c4d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61  =SQLITE_OK ) pPa
c4e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
c4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c500: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
c510: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
c520: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
c530: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
c540: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
c550: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
c560: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c570: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
c580: 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a  ager->pInStmt);.
c590: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
c5a0: 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
c5b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c5c0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
c5d0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
c5e0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
c5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
c600: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c610: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
c620: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
c630: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
c640: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
c650: 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  toopen = 0;.    
c660: 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
c670: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  DbSize = 0;.    
c680: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
c690: 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61  f( !MEMDB || pPa
c6a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
c6b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c6c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
c6d0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
c6e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
c6f0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
c700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c710: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
c720: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
c730: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
c740: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
c750: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
c760: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
c770: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
c780: 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
c790: 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f  state, .** do no
c7a0: 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f  t attempt the ro
c7b0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
c7c0: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
c7d0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
c7e0: 67 65 72 20 2a 70 29 7b 0a 20 20 2f 2a 20 61 73  ger *p){.  /* as
c7f0: 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
c800: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
c810: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  | p->journalOpen
c820: 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 69 66 28 20  ==0 ); */.  if( 
c830: 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  p->errCode==SQLI
c840: 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74  TE_OK && p->stat
c850: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
c860: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
c870: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
c880: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
c890: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29  PagerRollback(p)
c8a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
c8b0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
c8c0: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
c8d0: 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20 20 61  ck(p);.#if 0.  a
c8e0: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
c8f0: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
c900: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
c910: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
c920: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
c930: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
c940: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
c950: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
c960: 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64 69 66  veMode );.#endif
c970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c980: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
c990: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
c9a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
c9b0: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
c9c0: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
c9d0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
c9e0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c9f0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
ca00: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
ca10: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
ca20: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
ca30: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
ca40: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
ca50: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
ca60: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
ca70: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
ca80: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
ca90: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
caa0: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
cab0: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
cac0: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
cad0: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
cae0: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
caf0: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
cb00: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
cb10: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
cb20: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
cb30: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
cb40: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
cb50: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
cb60: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
cb70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
cb80: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
cb90: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
cba0: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
cbb0: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
cbc0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
cbd0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
cbe0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
cbf0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
cc00: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
cc10: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
cc20: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
cc30: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
cc40: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
cc50: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
cc60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
cc70: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
cc80: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
cc90: 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
cca0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
ccb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ccc0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
ccd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
cce0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
ccf0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
cd00: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
cd10: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
cd20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cd30: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
cd40: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
cd50: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
cd60: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
cd70: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cd80: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
cd90: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
cda0: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
cdb0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
cdc0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
cdd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
cde0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
cdf0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
ce00: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
ce10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
ce20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ce30: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
ce40: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
ce50: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
ce60: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
ce70: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
ce80: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
ce90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cea0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
ceb0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cec0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
ced0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cee0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cef0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cf00: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cf10: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
cf20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cf30: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
cf40: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
cf50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cf60: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
cf70: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
cf80: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
cf90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
cfa0: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
cfb0: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
cfc0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
cfd0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
cfe0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
cff0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
d000: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
d010: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
d020: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
d030: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
d040: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
d050: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
d060: 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61  .      pPg->alwa
d070: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
d080: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
d090: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
d0a0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
d0b0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
d0c0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
d0d0: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
d0e0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
d0f0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
d100: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
d110: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
d120: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
d130: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
d140: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  nal==0 );.  }.. 
d150: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
d160: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
d170: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
d180: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
d190: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
d1a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
d1b0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
d1c0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
d1d0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
d1e0: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
d1f0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
d200: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
d210: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
d220: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
d230: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
d240: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
d250: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c  eedSync = 0;.  l
d260: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
d270: 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
d280: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
d290: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64   -1;.  pPager->d
d2a0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
d2b0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
d2c0: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
d2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
d2e0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
d2f0: 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20  hecksum for the 
d300: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  page of data..**
d310: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
d320: 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
d330: 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a    It is really j
d340: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d350: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d360: 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20  itial value and 
d370: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  the page number.
d380: 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65    We experimente
d390: 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63  d with.** a chec
d3a0: 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69  ksum of the enti
d3b0: 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61  re data, but tha
d3c0: 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62  t was found to b
d3d0: 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a  e too slow..**.*
d3e0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
d3f0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73  page number is s
d400: 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67  tored at the beg
d410: 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61  inning of data a
d420: 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73  nd.** the checks
d430: 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  um is stored at 
d440: 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69  the end.  This i
d450: 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66  s important.  If
d460: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72   journal.** corr
d470: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d480: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d490: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d4a0: 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a  ikely scenario.*
d4b0: 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  * is that one en
d4c0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
d4d0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
d4e0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49  l be changed.  I
d4f0: 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73  t is.** much les
d500: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
d510: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
d520: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
d530: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
d540: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
d550: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
d560: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
d570: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
d580: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
d590: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
d5a0: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
d5b0: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
d5c0: 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58  ption..**.** FIX
d5d0: 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61   ME:  Consider a
d5e0: 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74  dding every 200t
d5f0: 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f  h (or so) byte o
d600: 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  f the data to th
d610: 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20  e.** checksum.  
d620: 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69  That way if a si
d630: 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20  ngle page spans 
d640: 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73  3 or more disk s
d650: 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e  ectors and.** on
d660: 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65  ly the middle se
d670: 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c  ctor is corrupt,
d680: 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68   we will still h
d690: 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65  ave a reasonable
d6a0: 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61  .** chance of fa
d6b0: 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  iling the checks
d6c0: 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65  um and thus dete
d6d0: 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  cting the proble
d6e0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  m..*/.static u32
d6f0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
d700: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
d710: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
d720: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
d730: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
d740: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
d750: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
d760: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
d770: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
d780: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
d790: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
d7a0: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f   cksum;.}../* Fo
d7b0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
d7c0: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
d7d0: 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
d7e0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  *);../*.** Read 
d7f0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
d800: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
d810: 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69  ile opened on fi
d820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a  le descriptor.**
d830: 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20   jfd.  Playback 
d840: 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  this one page..*
d850: 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d  *.** If useCksum
d860: 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
d870: 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  s journal does n
d880: 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73  ot use checksums
d890: 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  .  Checksums.** 
d8a0: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
d8b0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d8c0: 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65  ls because state
d8d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f  ment journals do
d8e0: 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20   not.** need to 
d8f0: 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61  survive power fa
d900: 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ilures..*/.stati
d910: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
d920: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20  back_one_page(. 
d930: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
d940: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d950: 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66 73  *jfd,.  i64 offs
d960: 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b 73  et,.  int useCks
d970: 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  um.){.  int rc;.
d980: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
d9b0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
d9c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
d9f0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
da00: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
da10: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da30: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
da40: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
da50: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
da60: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
da70: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
da80: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
da90: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
daa0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
dab0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
dac0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
dad0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
dae0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
daf0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
db00: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
db10: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
db20: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
db30: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
db40: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
db50: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
db60: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
db70: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
db80: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c  its(jfd, offset,
db90: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
dba0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
dbb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
dbc0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
dbd0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
dbe0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
dbf0: 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  set+4);.  if( rc
dc00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
dc10: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
dc20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
dc30: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
dc40: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
dc50: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
dc60: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
dc70: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
dc80: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
dc90: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
dca0: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
dcb0: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
dcc0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
dcd0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
dce0: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
dcf0: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
dd00: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
dd10: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
dd20: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
dd30: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
dd40: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
dd50: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
dd60: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
dd70: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
dd80: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
dd90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
dda0: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
ddb0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
ddc0: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
ddd0: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
dde0: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
ddf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
de00: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
de10: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
de20: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
de30: 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70  offset+pPager->p
de40: 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
de50: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
de60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
de70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
de80: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
de90: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
dea0: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
deb0: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
dec0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
ded0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
dee0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
def0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
df00: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
df10: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
df20: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
df30: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
df40: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
df50: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
df60: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
df70: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
df80: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
df90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
dfa0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
dfb0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
dfc0: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
dfd0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
dfe0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
dff0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
e000: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
e010: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
e020: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
e030: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e040: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
e050: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
e060: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
e070: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
e080: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
e090: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
e0a0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
e0b0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
e0c0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
e0d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
e0e0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
e0f0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
e100: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e110: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
e120: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
e130: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e140: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e150: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e160: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e170: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e180: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e190: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e1a0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e1b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
e1c0: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
e1d0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
e1e0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
e1f0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
e200: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
e210: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
e220: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e230: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
e240: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
e250: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
e260: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
e270: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
e280: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e290: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e2a0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
e2b0: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
e2c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
e2d0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
e2e0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
e2f0: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
e300: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
e310: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
e320: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
e330: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
e340: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
e350: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
e360: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
e370: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
e380: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
e390: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
e3a0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
e3b0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
e3c0: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
e3d0: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
e3e0: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
e3f0: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
e400: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
e410: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e420: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
e430: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
e440: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
e450: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
e460: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
e470: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
e480: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
e490: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
e4a0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
e4b0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
e4c0: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
e4d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
e4e0: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
e4f0: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
e500: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
e510: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
e520: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
e530: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
e540: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
e550: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
e560: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
e570: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
e580: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
e590: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
e5a0: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
e5b0: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
e5c0: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
e5d0: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
e5e0: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
e5f0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
e600: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
e610: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
e620: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
e630: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
e640: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
e650: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
e660: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
e670: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
e680: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
e690: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
e6a0: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
e6b0: 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE4("PLAYBACK %d
e6c0: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
e6d0: 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
e6e0: 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
e6f0: 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
e700: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
e710: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61  ger->pageSize, a
e720: 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70 50  Data));.  if( pP
e730: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e740: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
e750: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
e760: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20 20 20  needSync==0).   
e770: 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
e780: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
e790: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
e7a0: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
e7b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
e7c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e7d0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
e7e0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
e7f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
e800: 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70  fset);.    if( p
e810: 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65  Pg ){.      make
e820: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
e830: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  }.  }.  if( pPg 
e840: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
e850: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
e860: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
e870: 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
e880: 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
e890: 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
e8a0: 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
e8b0: 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
e8c0: 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
e8d0: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
e8e0: 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
e8f0: 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
e900: 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
e910: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
e920: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
e930: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
e940: 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
e950: 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
e960: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
e970: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
e980: 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
e990: 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73  pData;.    /* as
e9a0: 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
e9b0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d  =0 || pPg->pgno=
e9c0: 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61  =1 ); */.    pDa
e9d0: 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
e9e0: 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d  TA(pPg);.    mem
e9f0: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
ea00: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ea10: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
ea20: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
ea30: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
ea40: 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20 70  xReiniter(pPg, p
ea50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ea60: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
ea70: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
ea80: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
ea90: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
eaa0: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
eab0: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
eac0: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
ead0: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
eae0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
eaf0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
eb00: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
eb10: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
eb20: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
eb30: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
eb40: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
eb50: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
eb60: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
eb70: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
eb80: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
eb90: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
eba0: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
ebb0: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
ebc0: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
ebd0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
ebe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
ebf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
ec00: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
ec10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
ec20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ec30: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
ec40: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
ec50: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
ec60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ec70: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
ec80: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
ec90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
eca0: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
ecb0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
ecc0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
ecd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
ece0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
ecf0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
ed00: 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
ed10: 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
ed20: 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
ed30: 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
ed40: 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
ed50: 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
ed60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
ed70: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
ed80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
ed90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
eda0: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
edb0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
edc0: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
edd0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
ede0: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
edf0: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
ee00: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
ee10: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
ee20: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
ee30: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
ee40: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
ee50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
ee60: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
ee70: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
ee80: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
ee90: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
eea0: 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
eeb0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
eec0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
eed0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
eee0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
eef0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d   int rc;.  int m
ef00: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a  aster_open = 0;.
ef10: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
ef20: 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74  pMaster;.  sqlit
ef30: 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  e3_file *pJourna
ef40: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  l;.  char *zMast
ef50: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
ef60: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
ef70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ef80: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
ef90: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
efa0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
efb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
efc0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
efd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
efe0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
eff0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
f000: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
f010: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
f020: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
f030: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
f040: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
f050: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d  rence..  */.  pM
f060: 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
f070: 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
f080: 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73  alloc(pVfs->szOs
f090: 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
f0a0: 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
f0b0: 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
f0c0: 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
f0d0: 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
f0e0: 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
f0f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
f100: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
f110: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
f120: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
f130: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
f140: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
f150: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f160: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
f170: 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
f180: 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
f190: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f1a0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
f1b0: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
f1c0: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72  r_open = 1;..  r
f1d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
f1e0: 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
f1f0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
f200: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f210: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
f220: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
f230: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
f240: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
f250: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
f260: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
f270: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
f280: 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d  terPtr = pPager-
f290: 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
f2a0: 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
f2b0: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
f2c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f2d0: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
f2e0: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
f2f0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
f300: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
f310: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
f320: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
f330: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
f340: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
f350: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
f360: 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
f370: 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  tr);.    if( !zM
f380: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
f390: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f3a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
f3b0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
f3c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61  t;.    }.    zMa
f3d0: 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
f3e0: 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
f3f0: 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72  rJournal];.    r
f400: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
f410: 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
f420: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
f430: 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
f440: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f450: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
f460: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
f470: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
f480: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
f490: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
f4a0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
f4b0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
f4c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73  {.      int exis
f4d0: 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ts;.      rc = s
f4e0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
f4f0: 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
f500: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
f510: 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
f520: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f530: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f540: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
f550: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
f560: 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
f570: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
f580: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
f590: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
f5a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f5b0: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
f5c0: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
f5d0: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
f5e0: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
f5f0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
f600: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
f610: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
f620: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
f630: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
f640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f650: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
f660: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
f670: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
f680: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
f690: 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
f6a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f6b0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
f6c0: 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
f6d0: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
f6e0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f6f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f700: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
f710: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
f720: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
f730: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
f740: 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
f750: 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
f760: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
f770: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
f780: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
f790: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
f7b0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
f7c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
f7d0: 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
f7e0: 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
f7f0: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
f800: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
f810: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
f820: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
f830: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
f840: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f850: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f860: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
f870: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f880: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
f890: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
f8a0: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
f8b0: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
f8c0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
f8d0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
f8e0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f8f0: 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
f900: 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
f910: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
f920: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
f930: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
f940: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
f950: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
f960: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
f970: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ster);.  }.  sql
f980: 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
f990: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
f9a0: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
f9b0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
f9c0: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
f9d0: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
f9e0: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
f9f0: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
fa00: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
fa10: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
fa20: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
fa30: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
fa40: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
fa50: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
fa60: 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d 69 67  .**.** Might mig
fa70: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
fa80: 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
fa90: 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
faa0: 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54  than nPage..** T
fab0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  his can happen, 
fac0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  for example, if 
fad0: 77 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d 69  we are in the mi
fae0: 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e 73 61  ddle of a transa
faf0: 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68  ction.** which h
fb00: 61 73 20 65 78 74 65 6e 64 65 64 20 74 68 65 20  as extended the 
fb10: 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20 74 68  file size and th
fb20: 65 20 6e 65 77 20 70 61 67 65 73 20 61 72 65 20  e new pages are 
fb30: 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a  still all held.*
fb40: 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  * in cache, then
fb50: 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50   an INSERT or UP
fb60: 44 41 54 45 20 64 6f 65 73 20 61 20 73 74 61 74  DATE does a stat
fb70: 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  ement rollback. 
fb80: 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69   Some.** operati
fb90: 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
fba0: 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
fbb0: 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 79 6f  t confused if yo
fbc0: 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e  u try to.** trun
fbd0: 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
fbe0: 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
fbf0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
fc00: 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a  currently is,.**
fc10: 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
fc20: 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
fc30: 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
fc40: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
fc50: 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20  the new.** file 
fc60: 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74  instead..*/.stat
fc70: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
fc80: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
fc90: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
fca0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
fcb0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
fcc0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
fcd0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 70  R_EXCLUSIVE && p
fce0: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
fcf0: 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63  ods ){.    i64 c
fd00: 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
fd10: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
fd20: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
fd30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
fd40: 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
fd50: 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ewSize = pPager-
fd60: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
fd70: 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
fd80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
fd90: 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
fda0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
fdb0: 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
fdc0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
fdd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
fde0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
fdf0: 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
fe00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fe10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fe20: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
fe30: 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65  , "", 1, newSize
fe40: 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
fe50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
fe60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fe70: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
fe80: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
fe90: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
fea0: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
feb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fec0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
fed0: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
fee0: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
fef0: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
ff00: 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ize is at least 
ff10: 61 73 20 62 69 67 20 61 73 20 74 68 65 20 73 65  as big as the se
ff20: 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74  ctor size report
ff30: 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33  ed.** by sqlite3
ff40: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 20  OsSectorSize(). 
ff50: 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63   The minimum sec
ff60: 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31 32 2e  tor size is 512.
ff70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ff80: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
ff90: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
ffa0: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
ffb0: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
ffc0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
ffd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
ffe0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
fff0: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
10000 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
10010 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
10020 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
10030 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
10040 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
10050 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63   yet, in whcih c
10060 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
10070 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
10080 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
10090 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
100a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
100b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
100c0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
100d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
100e0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
100f0 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  512 ){.    pPage
10100 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10110 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  512;.  }.}../*.*
10120 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
10130 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
10140 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
10150 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
10160 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
10170 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
10180 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
10190 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
101a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
101b0 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
101c0 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
101d0 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
101e0 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
101f0 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
10200 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
10210 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
10220 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
10230 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
10240 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
10250 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
10260 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
10270 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
10280 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
10290 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
102a0 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
102b0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
102c0 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
102d0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
102e0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
102f0 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
10300 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
10310 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
10320 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
10330 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
10340 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10350 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
10360 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
10370 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
10380 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
10390 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
103a0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
103b0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
103c0 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
103d0 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
103e0 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
103f0 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
10400 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
10410 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
10420 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
10430 20 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a   the page case..
10440 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20  **  (7)  4 byte 
10450 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
10460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
10470 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
10480 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
10490 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
104a0 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
104b0 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
104c0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
104d0 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
104e0 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e  nal.).**  (8)  N
104f0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
10500 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10510 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
10520 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
10530 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
10540 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
10550 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
10560 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
10570 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
10580 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
10590 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
105a0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
105b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
105c0 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
105d0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
105e0 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
105f0 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20  UTF-8..**  (9)  
10600 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
10610 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
10620 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
10630 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
10640 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
10650 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
10660 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
10670 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
10680 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
10690 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
106a0 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
106b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
106c0 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
106d0 20 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61   first 8 items a
106e0 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
106f0 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
10700 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
10710 65 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65  e of the 9th ite
10720 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
10730 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
10740 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
10750 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
10760 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
10770 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
10780 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
10790 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
107a0 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
107b0 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
107c0 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
107d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
107e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
107f0 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
10800 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
10810 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
10820 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
10830 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
10840 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
10850 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
10860 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10870 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
10880 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
10890 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
108a0 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
108b0 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
108c0 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
108d0 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
108e0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
108f0 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
10900 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
10910 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
10920 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
10930 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
10940 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
10950 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
10960 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
10970 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
10980 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
10990 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
109a0 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
109b0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
109c0 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
109d0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
109e0 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
109f0 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
10a00 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
10a10 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
10a20 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
10a30 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
10a40 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
10a50 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
10a60 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
10a70 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
10a80 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
10a90 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
10aa0 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
10ab0 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
10ac0 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
10ad0 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
10ae0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
10af0 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
10b00 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
10b10 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
10b20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
10b30 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
10b40 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
10b50 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
10b60 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
10b70 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
10b80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
10b90 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
10ba0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
10bb0 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
10bc0 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
10bd0 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
10be0 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
10bf0 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
10c00 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
10c10 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
10c20 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
10c30 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
10c40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
10c50 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
10c60 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
10c70 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
10c80 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
10c90 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
10ca0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
10cb0 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
10cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10cd0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
10ce0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
10cf0 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
10d00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10d10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
10d20 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
10d30 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
10d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d50 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
10d60 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
10d70 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
10d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10d90 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
10da0 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
10db0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10dd0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
10de0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
10df0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
10e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
10e10 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
10e20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
10e30 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
10e40 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
10e50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
10e60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10e70 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
10e80 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
10e90 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
10ea0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
10eb0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
10ec0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10ed0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
10ee0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10ef0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
10f00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
10f10 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
10f20 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
10f30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10f40 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
10f50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10f60 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
10f70 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
10f80 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
10f90 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
10fa0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
10fb0 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
10fc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
10fd0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
10fe0 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
10ff0 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
11000 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
11010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
11020 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
11030 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
11040 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
11050 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
11060 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
11070 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
11080 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
11090 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
110a0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
110b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
110c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
110d0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
110e0 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
110f0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
11100 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
11110 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
11120 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
11130 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
11140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11150 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
11160 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
11170 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
11180 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
11190 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
111a0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
111b0 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
111c0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
111d0 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
111e0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
111f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
11200 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
11210 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
11220 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
11230 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
11240 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
11250 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
11260 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
11270 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
11280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11290 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
112a0 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
112b0 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
112c0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
112d0 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
112e0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
112f0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
11300 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
11310 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
11320 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
11330 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
11340 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
11350 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
11360 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
11370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11380 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
11390 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
113a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
113b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
113c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
113d0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
113e0 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
113f0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
11400 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
11410 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
11420 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
11430 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
11440 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
11450 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
11460 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
11470 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
11480 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
11490 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
114a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
114b0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
114c0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
114d0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
114e0 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
114f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
11500 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
11510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11530 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
11540 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
11550 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
11560 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
11570 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
11580 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
11590 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
115a0 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
115b0 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
115c0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
115d0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
115e0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
115f0 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
11600 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
11610 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
11620 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
11630 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
11640 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
11650 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
11660 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
11670 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
11680 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
11690 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
116a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
116b0 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
116c0 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
116d0 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
116e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
116f0 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
11700 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
11710 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
11720 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  565..    */.    
11730 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
11740 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
11750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11760 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
11770 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
11780 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
11790 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
117a0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
117b0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
117c0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
117d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
117e0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
117f0 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
11800 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
11810 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
11820 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
11830 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
11840 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
11850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11860 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11870 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
11880 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
11890 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
118a0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
118b0 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
118c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
118d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
118e0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
118f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11900 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
11910 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
11920 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
11930 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
11940 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
11950 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
11960 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
11970 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
11980 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
11990 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
119a0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
119b0 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
119c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
119d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
119e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
119f0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
11a00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11a10 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
11a20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
11a30 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
11a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
11a50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
11a60 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
11a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11a80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
11a90 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
11aa0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
11ab0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
11ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11ad0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
11ae0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
11af0 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
11b00 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
11b10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
11b20 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
11b30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
11b40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
11b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11b60 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
11b70 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
11b80 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
11b90 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66  ='\0');.  }.  if
11ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11bb0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
11bc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
11bd0 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
11be0 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
11bf0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
11c00 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
11c10 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
11c20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
11c30 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
11c40 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
11c50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
11c60 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
11c70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
11c80 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
11c90 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
11ca0 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
11cb0 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
11cc0 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
11cd0 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
11ce0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
11cf0 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
11d00 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
11d10 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
11d20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
11d30 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
11d40 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
11d50 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
11d60 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
11d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
11d80 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
11d90 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
11da0 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
11db0 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
11dc0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11dd0 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
11de0 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
11df0 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
11e00 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
11e10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
11e20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11e30 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
11e40 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
11e50 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
11e60 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
11e70 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
11e80 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
11e90 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
11ea0 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
11eb0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
11ec0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
11ed0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
11ee0 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
11ef0 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
11f00 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
11f10 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11f20 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
11f30 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
11f40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
11f50 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
11f60 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
11f70 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
11f80 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
11fb0 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
11fc0 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20    i64 hdrOff;.  
11fd0 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
11fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11ff0 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
12000 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
12010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
12020 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
12030 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20   int rc;..  szJ 
12040 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
12050 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  lOff;..  /* Set 
12060 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
12070 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74   offset just aft
12080 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
12090 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e last journal. 
120a0 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e   ** page written
120b0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
120c0 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
120d0 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
120e0 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
120f0 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e  tion was written
12100 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
12110 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
12120 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
12130 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
12140 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
12150 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
12160 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
12170 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
12180 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
12190 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
121a0 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
121b0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
121c0 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
121d0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
121e0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
121f0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
12200 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
12210 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
12220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12230 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
12240 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
12250 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12260 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
12270 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
12280 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
12290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
122a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
122b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
122c0 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20  pen );.  nRec = 
122d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
122e0 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
122f0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
12300 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
12310 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
12320 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
12330 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
12340 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
12350 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
12360 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
12370 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
12380 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
12390 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
123a0 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
123b0 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
123c0 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
123d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
123e0 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
123f0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
12400 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61   i*(4+pPager->pa
12410 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20  geSize);.    rc 
12420 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
12430 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
12440 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
12450 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  offset, 0);.    
12460 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
12470 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
12480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12490 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
124a0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
124b0 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
124c0 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
124d0 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
124e0 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
124f0 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
12500 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
12510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12520 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
12530 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
12540 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
12550 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
12560 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
12570 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
12580 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
12590 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
125a0 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
125b0 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
125c0 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
125d0 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
125e0 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
125f0 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
12600 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
12610 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
12620 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
12630 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
12640 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12650 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
12660 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
12670 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
12680 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
12690 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
126a0 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  ksum;.  while( p
126b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
126c0 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20  f < hdrOff ){.  
126d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
126e0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
126f0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
12700 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
12710 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
12720 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
12730 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
12740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12750 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
12760 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
12770 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
12780 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
12790 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
127a0 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
127b0 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
127c0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
127d0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
127e0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
127f0 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
12800 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
12810 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12820 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12830 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
12840 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
12850 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
12860 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
12870 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
12880 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
12890 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
128a0 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
128b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
128c0 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
128d0 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
128e0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
128f0 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
12900 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
12910 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
12920 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
12930 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
12940 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
12950 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
12960 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
12970 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
12980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12990 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
129a0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
129b0 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
129c0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
129d0 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
129e0 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
129f0 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
12a00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12a10 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
12a20 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
12a30 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
12a40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
12a60 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
12a70 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
12a80 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
12a90 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
12aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
12ab0 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
12ac0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
12ad0 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
12ae0 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>10 ){.    pPa
12af0 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78  ger->mxPage = mx
12b00 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
12b10 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
12b20 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e = 10;.  }.}../
12b30 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
12b40 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
12b50 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
12b60 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
12b70 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
12b80 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
12b90 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
12ba0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
12bb0 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
12bc0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
12bd0 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
12be0 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
12bf0 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
12c00 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
12c10 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
12c20 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
12c30 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
12c40 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
12c50 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
12c60 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
12c70 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
12c80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
12c90 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
12ca0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
12cb0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
12cc0 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
12cd0 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
12ce0 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
12cf0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
12d00 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
12d10 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
12d20 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
12d30 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
12d50 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
12d60 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
12d70 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
12d80 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
12d90 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
12da0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
12db0 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
12dc0 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
12dd0 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
12de0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
12df0 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
12e00 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
12e10 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
12e20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
12e30 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
12e40 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
12e50 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
12e60 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
12e70 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
12e80 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
12e90 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
12ea0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
12eb0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
12ec0 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
12ed0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12ee0 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
12ef0 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
12f00 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
12f10 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
12f20 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
12f30 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
12f40 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
12f50 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
12f60 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
12f70 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
12f80 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
12f90 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
12fa0 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
12fb0 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
12fc0 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
12fd0 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
12fe0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
12ff0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13000 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
13010 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
13020 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
13030 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
13040 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
13050 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
13060 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
13070 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
13080 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
13090 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  , int full_fsync
130a0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
130b0 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
130c0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
130d0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
130e0 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
130f0 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
13100 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
13110 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
13120 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49  (full_fsync?SQLI
13130 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
13140 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
13150 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13160 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
13170 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
13180 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
13190 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
131a0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
131b0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
131c0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
131d0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
131e0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
131f0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
13200 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
13210 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
13220 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
13230 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
13240 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
13250 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
13260 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
13270 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
13280 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
13290 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
132a0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
132b0 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
132c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
132d0 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
132e0 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
132f0 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
13300 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
13310 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
13320 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a   the temporary.*
13330 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  * file when it i
13340 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  s closed..*/.sta
13350 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50  tic int sqlite3P
13360 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
13370 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
13380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
13390 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
133a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
133b0 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
133c0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
133d0 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
133e0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
133f0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
13400 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
13410 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
13420 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
13430 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
13440 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
13450 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
13460 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
13470 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
13480 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
13490 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
134a0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
134b0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
134c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
134d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
134e0 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
134f0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
13500 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13510 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
13520 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
13530 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
13540 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
13550 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
13560 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
13570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13580 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
13590 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
135a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
135b0 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
135c0 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
135d0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
135e0 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
135f0 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
13600 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
13610 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
13620 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
13630 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
13640 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
13650 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
13660 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
13670 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
13680 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
13690 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
136a0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
136b0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
136c0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
136d0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
136e0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
136f0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
13700 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
13710 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
13720 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
13730 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
13740 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
13750 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
13760 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
13770 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
13780 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
13790 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
137a0 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
137b0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
137c0 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
137d0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
137e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
137f0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13800 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
13810 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
13820 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
13830 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
13840 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
13850 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
13860 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
13870 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
13880 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
13890 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
138a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
138b0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
138c0 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
138d0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
138e0 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
138f0 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
13900 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13920 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
13930 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
13940 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
13950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
13960 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
13970 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
13980 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
13990 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
139a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
139b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
139c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
139d0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
139e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
139f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
13a00 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
13a10 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
13a20 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
13a30 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
13a40 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
13a50 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
13a60 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
13a70 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
13a80 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
13a90 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
13aa0 29 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 44  );.  int szPageD
13ab0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
13ac0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
13ad0 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
13ae0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  e = 0;.  int nPa
13af0 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f  thname = 0;..  /
13b00 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65  * The default re
13b10 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70  turn is a NULL p
13b20 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50  ointer */.  *ppP
13b30 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
13b40 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
13b50 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
13b60 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
13b70 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
13b80 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
13b90 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
13ba0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
13bb0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
13bc0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
13bd0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
13be0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
13bf0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
13c00 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
13c10 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
13c20 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
13c30 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
13c40 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
13c50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
13c60 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
13c70 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
13c80 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
13c90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13ca0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
13cb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13cc0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
13cd0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
13ce0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
13cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
13d00 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
13d10 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
13d20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
13d30 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
13d40 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13d50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13d60 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13d70 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
13d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13db0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
13dc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13dd0 20 20 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61     }.    nPathna
13de0 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74  me = strlen(zPat
13df0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  hname);.  }..  /
13e00 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
13e10 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  y for the pager 
13e20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
13e30 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  Pager = sqlite3M
13e40 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73  allocZero(.    s
13e50 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
13e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13e70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
13e80 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
13e90 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20  Size +          
13ea0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
13eb0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a  file structure *
13ec0 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f  / .    pVfs->szO
13ed0 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20 20  sFile * 3 +     
13ee0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
13ef0 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61  b and two journa
13f00 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
13f10 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30  3*nPathname + 40
13f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
13f30 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63  Filename, zDirec
13f40 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a  tory, zJournal *
13f50 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50  /.  );.  if( !pP
13f60 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ager ){.    sqli
13f70 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
13f80 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
13f90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13fa0 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  }.  pPtr = (u8 *
13fb0 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
13fc0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
13fd0 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50  = vfsFlags;.  pP
13fe0 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69  ager->fd = (sqli
13ff0 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
14000 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30  pVfs->szOsFile*0
14010 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66  ];.  pPager->stf
14020 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
14030 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
14040 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50  zOsFile*1];.  pP
14050 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c  ager->jfd = (sql
14060 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
14070 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
14080 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  2];.  pPager->zF
14090 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
140a0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
140b0 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46  sFile*2+journalF
140c0 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  ileSize];.  pPag
140d0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
140e0 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
140f0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
14100 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
14110 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
14120 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68  zDirectory[nPath
14130 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65  name+1];.  pPage
14140 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
14150 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
14160 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ){.    memcpy(pP
14170 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14180 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
14190 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73 71  hname+1);.    sq
141a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
141b0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  name);.  }..  /*
141c0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
141d0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
141e0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
141f0 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d  ilename[0] && !m
14200 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20  emDb ){.    if( 
14210 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d  nPathname>(pVfs-
14220 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69  >mxPathname - si
14230 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29  zeof("-journal")
14240 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
14250 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
14260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14270 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
14280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14290 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
142a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
142b0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20  , pPager->fd,.  
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76         pPager->v
142e0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
142f0 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  .      readOnly 
14300 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
14310 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
14320 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14330 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
14340 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
14350 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
14360 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f  ss,.      ** cho
14370 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
14380 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
14390 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
143a0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  e the.      ** d
143b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
143c0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
143d0 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
143e0 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a  um of:.      **.
143f0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51        **    + SQ
14400 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
14410 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a  E_SIZE,.      **
14420 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
14430 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
14440 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
14450 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  ).      **    + 
14460 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
14470 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
14480 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
14490 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ally..      */. 
144a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
144b0 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
144c0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  nly ){.        i
144d0 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d  nt iSectorSize =
144e0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
144f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
14500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
14510 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f 72  PageDflt<iSector
14520 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
14530 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
14540 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  SectorSize;.    
14550 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
14560 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
14570 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
14580 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
14590 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
145a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
145b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
145c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
145d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
145e0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
145f0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
14600 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
14610 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
14620 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
14630 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
14640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
14650 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
14660 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
14670 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
14680 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
14690 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
146a0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
146b0 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
146c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
146d0 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
146e0 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
146f0 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69  ) szPageDflt = i
14700 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
14710 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
14720 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
14730 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41  geDflt>SQLITE_MA
14740 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
14750 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
14760 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
14770 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
14780 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
14790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
147a0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
147b0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a  !memDb ){.    /*
147c0 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
147d0 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
147e0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
147f0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
14800 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
14810 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
14820 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
14830 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
14840 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
14850 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
14860 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
14870 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
14880 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  )..    */ .    t
14890 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
148a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
148b0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
148c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
148d0 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ger && rc==SQLIT
148e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
148f0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
14900 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
14910 63 28 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20  c(szPageDflt);. 
14920 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
14930 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
14940 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
14950 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a  ocks above..  **
14960 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20   Free the Pager 
14970 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
14980 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
14990 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  ** Since the pag
149a0 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
149b0 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
149c0 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
149d0 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
149e0 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
149f0 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
14a00 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54  r || !pPager->pT
14a10 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73  mpSpace ){.    s
14a20 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
14a30 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
14a40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
14a50 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
14a60 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
14a70 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
14a80 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
14a90 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
14aa0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
14ab0 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
14ac0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14ad0 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
14ae0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
14af0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
14b00 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a  Filename))..  /*
14b10 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
14b20 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20  Directory[] */. 
14b30 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
14b40 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67  zDirectory, pPag
14b50 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  er->zFilename, n
14b60 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66  Pathname+1);.  f
14b70 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67  or(i=strlen(pPag
14b80 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
14b90 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
14ba0 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
14bb0 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
14bc0 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
14bd0 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
14be0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c   = 0;..  /* Fill
14bf0 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e   in Pager.zJourn
14c00 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50  al[] */.  if( zP
14c10 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d  athname ){.    m
14c20 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
14c30 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
14c40 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
14c50 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
14c60 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
14c70 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
14c80 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a  "-journal", 9);.
14c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
14ca0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
14cb0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61  0;.  }..  /* pPa
14cc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
14cd0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
14ce0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
14cf0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
14d00 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
14d10 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
14d20 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
14d30 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
14d40 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
14d50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
14d60 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
14d70 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
14d80 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
14d90 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
14da0 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
14db0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 7a 50  ->pageSize = szP
14dc0 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a 20 70 50  ageDflt;.  /* pP
14dd0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
14de0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14df0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
14e00 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14e10 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
14e20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
14e30 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
14e40 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
14e50 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
14e60 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
14e70 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
14e80 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
14e90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14ea0 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
14eb0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
14ec0 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
14ed0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
14ee0 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
14ef0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
14f00 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
14f10 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
14f20 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
14f30 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
14f40 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
14f50 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14f60 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
14f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
14f80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
14f90 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
14fa0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
14fb0 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
14fc0 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
14fd0 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
14fe0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
14ff0 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
15000 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
15010 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
15020 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
15030 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
15040 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
15050 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
15060 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
15070 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
15080 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
15090 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
150a0 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
150b0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
150c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
150d0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
150e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
150f0 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
15100 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
15110 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
15120 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65  nExtra);.  pPage
15130 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
15140 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
15150 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
15160 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
15170 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
15180 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74  ethods||memDb||t
15190 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
151a0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
151b0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
151c0 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
151d0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
151e0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
151f0 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
15200 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
15210 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
15220 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
15230 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
15240 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
15250 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
15260 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
15270 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  MM = 0;.  pPager
15280 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
15290 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
152a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
152b0 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73 71  UTEX_NOOP.    sq
152c0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
152d0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
152e0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
152f0 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29  TEX_STATIC_MEM2)
15300 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
15310 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15320 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61  (mutex);.    pPa
15330 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c  ger->pNext = sql
15340 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20  ite3PagerList;. 
15350 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
15360 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  gerList ){.     
15370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15380 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
15390 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
153a0 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
153b0 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20  Prev = pPager;. 
153c0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
153d0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
153e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
153f0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73   = pPager;.    s
15400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15410 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
15420 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
15430 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15440 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
15450 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
15460 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15470 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
15480 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
15490 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
154a0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
154b0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
154c0 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
154d0 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
154e0 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
154f0 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
15500 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
15510 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
15520 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
15530 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
15540 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
15550 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
15560 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
15570 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
15580 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
15590 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
155a0 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
155b0 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
155c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
155d0 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
155e0 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
155f0 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
15600 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
15610 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
15620 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
15630 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
15640 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15650 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
15660 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
15670 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
15680 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
15690 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
156a0 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
156b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
156c0 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
156d0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
156e0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
156f0 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
15700 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
15710 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
15720 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
15730 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
15740 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
15750 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
15760 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
15770 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
15780 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
15790 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
157a0 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
157b0 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
157c0 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
157d0 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
157e0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
157f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
15800 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
15810 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
15820 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
15830 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
15840 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
15850 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
15860 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
15870 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  ize to *pPageSiz
15880 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73  e. If the sugges
15890 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  t new page size 
158a0 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69  is.** inappropri
158b0 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
158c0 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
158d0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61  ze is set to tha
158e0 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72  t.** value befor
158f0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
15900 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
15910 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
15920 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
15930 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e  pPageSize){.  in
15940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15950 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a 65  ;.  u16 pageSize
15960 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
15970 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
15980 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
15990 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
159a0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
159b0 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
159c0 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
159d0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
159e0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26  >pageSize .   &&
159f0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
15a00 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
15a10 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  =0 .  ){.    cha
15a20 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
15a30 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
15a40 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
15a50 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
15a60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15a70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
15a80 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45  se{.      pagerE
15a90 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
15aa0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15ab0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
15ac0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15ad0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
15ae0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
15af0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15b00 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15b10 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
15b20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
15b30 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
15b40 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65  w;.      pagerLe
15b50 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
15b60 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53   }.  }.  *pPageS
15b70 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
15b80 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  geSize;.  return
15b90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15ba0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
15bb0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
15bc0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
15bd0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
15be0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
15bf0 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
15c00 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
15c10 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
15c20 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
15c30 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
15c40 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
15c50 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
15c60 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
15c70 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
15c80 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
15c90 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
15ca0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
15cb0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
15cc0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
15cd0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
15ce0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
15cf0 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
15d00 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
15d10 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
15d20 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
15d30 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
15d40 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15d50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
15d60 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
15d70 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
15d80 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
15d90 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
15da0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
15db0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
15dc0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
15dd0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
15de0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
15df0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
15e00 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
15e10 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
15e20 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
15e30 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
15e40 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
15e50 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
15e60 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
15e70 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
15e80 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
15e90 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
15ea0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
15eb0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
15ec0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
15ed0 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
15ee0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
15ef0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65  pPager, 0);.  re
15f00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
15f10 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
15f20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
15f30 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
15f40 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
15f50 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
15f60 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
15f70 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
15f80 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
15f90 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
15fa0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
15fb0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
15fc0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
15fd0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
15fe0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
15ff0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
16000 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
16010 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
16020 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
16030 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
16040 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
16050 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
16060 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
16070 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
16080 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
16090 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
160a0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
160b0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
160c0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
160d0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
160e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
160f0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
16100 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
16110 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
16120 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
16130 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
16140 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
16150 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
16160 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
16170 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
16180 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
16190 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
161a0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
161b0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
161c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
161d0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
161e0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
161f0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
16200 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
16210 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
16220 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
16230 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
16240 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
16250 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
16260 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
16270 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
16280 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
16290 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
162a0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
162b0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
162c0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
162d0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
162e0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
162f0 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
16300 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
16310 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
16320 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
16330 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
16340 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
16350 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
16360 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
16370 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
16380 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
16390 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
163a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
163b0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
163c0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
163d0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
163e0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
163f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16400 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
16410 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
16420 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61  ssert(MEMDB||pPa
16430 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
16440 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
16450 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ile);.  if( pPag
16460 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
16470 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
16480 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
16490 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
164a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
164b0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
164c0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
164d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
164e0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
164f0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
16500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16510 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
16530 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
16540 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
16550 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
16560 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
16570 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a  ** pPager. .**.*
16580 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47  * If the PENDING
16590 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68  _BYTE lies on th
165a0 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20  e page directly 
165b0 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
165c0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68   the.** file, th
165d0 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  en consider this
165e0 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68   page part of th
165f0 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20  e file too. For 
16600 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50  example, if.** P
16610 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62  ENDING_BYTE is b
16620 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69  yte 4096 (the fi
16630 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65  rst byte of page
16640 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65   5) and the size
16650 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   of the.** file 
16660 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35  is 4096 bytes, 5
16670 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
16680 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e  tead of 4..*/.in
16690 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
166a0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
166b0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
166c0 67 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  ge){.  i64 n = 0
166d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
166e0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
166f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16700 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
16710 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
16720 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
16730 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
16740 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
16750 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
16760 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73   } else {.    as
16770 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
16780 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
16790 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
167a0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66    if( (pPager->f
167b0 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20  d->pMethods).   
167c0 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
167d0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
167e0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
167f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16800 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16810 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
16820 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16830 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16840 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74  Ref--;.      ret
16850 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16860 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
16870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
16880 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
16890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
168a0 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
168b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
168c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
168d0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
168e0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
168f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
16900 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
16910 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
16920 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16930 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
16940 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72  }.  if( n>pPager
16950 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
16960 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
16970 20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e   n;.  }.  if( pn
16980 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50  Page ){.    *pnP
16990 61 67 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  age = n;.  }.  r
169a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
169b0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
169c0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
169d0 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
169e0 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
169f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
16a00 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
16a10 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
16a20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
16a30 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
16a40 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
16a50 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
16a60 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
16a70 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
16a80 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
16a90 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
16aa0 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
16ab0 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
16ac0 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
16ad0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
16ae0 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
16af0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
16b00 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
16b10 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
16b20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
16b30 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
16b40 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
16b50 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
16b60 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
16b70 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
16b80 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
16b90 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
16ba0 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
16bb0 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
16bc0 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
16bd0 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
16be0 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
16bf0 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
16c00 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
16c10 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
16c20 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
16c30 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
16c40 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
16c50 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  gno==0 ){.    as
16c60 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
16c70 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
16c80 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
16c90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16ca0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
16cb0 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
16cc0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
16cd0 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
16ce0 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
16cf0 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
16d00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16d10 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50  pPager->aHash[pP
16d20 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
16d30 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50  r->nHash-1)]!=pP
16d40 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
16d50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
16d60 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
16d70 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
16d80 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70    int h = pPg->p
16d90 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
16da0 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61  Hash-1);.    pPa
16db0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
16dc0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
16dd0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
16de0 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74  ){.    clearHist
16df0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
16e00 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
16e10 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  .  }.  pPg->pgno
16e20 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
16e30 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
16e40 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
16e50 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
16e60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
16e70 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
16e80 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
16e90 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
16ea0 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
16eb0 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
16ec0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
16ed0 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
16ee0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
16ef0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
16f00 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55  >pPager;..  /* U
16f10 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20  nlink from free 
16f20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c  page list */.  l
16f30 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
16f40 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  );..  /* Unlink 
16f50 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
16f60 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
16f70 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
16f80 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
16f90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16fa0 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
16fb0 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
16fc0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
16fd0 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
16fe0 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
16ff0 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
17000 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
17010 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
17020 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
17030 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
17040 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
17050 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
17060 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
17070 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
17080 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
17090 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
170a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
170b0 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
170c0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
170d0 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
170e0 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
170f0 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
17100 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
17110 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
17120 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
17130 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
17140 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
17150 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
17160 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
17170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17180 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
17190 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
171a0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
171b0 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
171c0 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
171d0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
171e0 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
171f0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
17200 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
17210 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
17220 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
17230 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
17240 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
17250 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
17260 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
17270 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
17280 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
17290 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
172a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
172b0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
172c0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
172d0 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
172e0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 23 69 66 64  ->pNextAll;.#ifd
172f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17300 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
17310 4e 54 0a 20 20 20 20 20 20 69 66 28 20 2a 70 70  NT.      if( *pp
17320 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a  Pg ){.        (*
17330 70 70 50 67 29 2d 3e 70 50 72 65 76 41 6c 6c 20  ppPg)->pPrevAll 
17340 3d 20 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 3b  = pPg->pPrevAll;
17350 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
17360 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
17370 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
17380 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
17390 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
173a0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
173b0 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
173c0 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  t);.      unlink
173d0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
173e0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
173f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17400 67 65 46 72 65 65 28 70 50 67 2d 3e 70 44 61 74  geFree(pPg->pDat
17410 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
17420 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20  3_free(pPg);.   
17430 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
17440 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
17450 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
17460 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
17470 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
17480 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
17490 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
174a0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
174b0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
174c0 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75  eat until the bu
174d0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
174e0 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20  rns.** false or 
174f0 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73  until the lock s
17500 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
17510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
17520 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
17530 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
17540 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
17550 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  .** the lock..*/
17560 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17570 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
17580 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
17590 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
175a0 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
175b0 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
175c0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
175d0 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
175e0 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
175f0 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
17600 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
17610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
17620 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
17630 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
17640 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
17650 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
17660 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
17670 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
17680 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
17690 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
176a0 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
176b0 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
176c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
176d0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
176e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c  ager->dbSize<0 |
176f0 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66  | MEMDB );..  if
17700 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17710 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
17720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17730 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
17740 28 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  ( pPager->pBusyH
17750 61 6e 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d  andler ) pPager-
17760 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e  >pBusyHandler->n
17770 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f  Busy = 0;.    do
17780 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
17790 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
177a0 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
177b0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
177c0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
177d0 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
177e0 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
177f0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
17800 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
17810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17820 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
17830 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
17840 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
17850 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
17860 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20  er, locktype)). 
17870 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17880 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
17890 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
178a0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
178b0 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
178c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
178d0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50  3PagerTruncate(P
178e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
178f0 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
17900 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
17910 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
17920 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45  GER_SHARED || ME
17930 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  MDB );.  sqlite3
17940 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17950 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28  Pager, 0);.  if(
17960 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
17980 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
179a0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
179b0 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
179c0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
179d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
179e0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
179f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
17a00 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
17a10 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
17a20 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
17a30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17a40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67  TE_OK;.  }.  pag
17a50 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
17a60 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
17a70 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70  nal(pPager);.  p
17a80 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
17a90 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17ab0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
17ac0 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
17ad0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
17ae0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
17af0 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
17b00 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
17b10 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
17b20 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
17b30 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
17b40 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c  _LOCK);.  pagerL
17b50 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
17b60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17b70 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
17b80 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
17b90 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
17ba0 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
17bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17bc0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
17bd0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
17be0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
17bf0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
17c00 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
17c10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
17c20 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
17c30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17c40 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
17c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
17c60 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
17c70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
17c80 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
17c90 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
17ca0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
17cb0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
17cc0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
17cd0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
17ce0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
17cf0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
17d00 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
17d10 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
17d20 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
17d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
17d40 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
17d50 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
17d60 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
17d70 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
17d80 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
17d90 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
17da0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
17db0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
17dc0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
17dd0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
17de0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
17df0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
17e00 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
17e10 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
17e20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
17e30 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
17e40 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17e50 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
17e60 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
17e70 4d 45 4d 44 42 20 29 7b 0a 23 69 66 6e 64 65 66  MEMDB ){.#ifndef
17e80 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
17e90 4f 50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  OP.    sqlite3_m
17ea0 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
17eb0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
17ec0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
17ed0 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69  TIC_MEM2);.#endi
17ee0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  f.    sqlite3_mu
17ef0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
17f00 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17f10 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
17f20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e   pPager->pPrev->
17f30 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
17f40 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
17f50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
17f60 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
17f70 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
17f80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17f90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
17fa0 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50  Pager->pNext->pP
17fb0 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70 50  rev = pPager->pP
17fc0 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  rev;.    }.    s
17fd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17fe0 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
17ff0 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
18000 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
18010 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
18020 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
18030 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
18040 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
18050 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
18060 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
18070 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
18080 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
18090 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
180a0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
180b0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
180c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
180d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
180e0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
180f0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
18100 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
18110 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
18120 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
18130 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
18140 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
18150 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18160 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
18170 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
18180 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
18190 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  pInJournal);.  i
181a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
181b0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
181c0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
181d0 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
181e0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
181f0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
18200 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
18210 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
18220 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
18230 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
18240 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
18250 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
18260 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
18270 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
18280 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  */..  sqlite3_fr
18290 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
182a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
182b0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
182c0 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
182d0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
182e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
182f0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
18300 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
18310 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
18320 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
18330 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
18340 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
18350 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
18360 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
18370 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
18380 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
18390 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
183a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
183b0 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
183c0 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
183d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
183e0 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
183f0 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
18400 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
18410 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
18420 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
18430 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
18440 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
18450 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
18460 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
18470 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
18480 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
18490 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
184a0 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
184b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
184c0 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
184d0 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
184e0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
184f0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
18500 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
18510 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
18520 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
18530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
18540 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
18550 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
18560 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
18570 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
18580 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
18590 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
185a0 69 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69  it. */.    lruLi
185b0 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20  stRemove(pPg);. 
185c0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
185d0 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
185e0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23 69 66  g->nRef++;.}.#if
185f0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18600 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
18610 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
18620 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
18630 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
18640 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
18650 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18660 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
18670 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
18680 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
18690 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
186a0 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
186b0 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
186c0 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
186d0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
186e0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
186f0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
18700 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
18710 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
18720 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
18730 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
18740 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
18750 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65  ge *pPg){.  page
18760 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67  rEnter(pPg->pPag
18770 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  er);.  page_ref(
18780 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  pPg);.  pagerLea
18790 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  ve(pPg->pPager);
187a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
187b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
187c0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
187d0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
187e0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
187f0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
18800 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
18810 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
18820 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
18830 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
18840 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
18850 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
18860 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
18870 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
18880 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
18890 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
188a0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
188b0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
188c0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
188d0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
188e0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
188f0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
18900 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
18910 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
18920 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
18930 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
18940 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
18950 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
18960 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
18970 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
18980 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
18990 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
189a0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
189b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
189c0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
189d0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
189e0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
189f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
18a00 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
18a10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
18a20 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
18a30 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
18a40 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
18a50 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
18a60 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
18a70 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
18a80 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
18a90 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
18aa0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
18ab0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
18ac0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
18ad0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
18ae0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
18af0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
18b00 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
18b10 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
18b20 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
18b30 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
18b40 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  o no sync occurs
18b50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
18b60 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
18b70 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
18b80 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
18b90 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a  edia on which.**
18ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
18bb0 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73   stored, then Os
18bc0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
18bd0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f  called on the jo
18be0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49  urnal.** file. I
18bf0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
18c00 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
18c10 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68   is to update th
18c20 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a  e nRec field in.
18c30 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
18c40 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eader..**.** Thi
18c50 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
18c60 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
18c70 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
18c80 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
18c90 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
18ca0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
18cb0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
18cc0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
18cd0 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
18ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
18cf0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
18d00 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
18d10 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
18d20 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
18d30 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
18d40 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
18d50 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
18d60 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
18d70 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
18d80 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
18d90 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
18da0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
18db0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
18dc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
18dd0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
18de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18df0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
18e00 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18e10 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18e20 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
18e30 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18e40 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
18e50 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
18e60 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
18e70 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
18e80 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
18e90 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
18ea0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
18eb0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
18ec0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
18ed0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
18ee0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
18ef0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
18f00 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
18f10 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
18f20 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
18f30 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
18f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
18f50 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
18f60 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
18f70 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
18f80 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
18f90 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
18fa0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
18fb0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
18fc0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
18fd0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
18fe0 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
18ff0 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
19000 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
19010 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
19020 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
19030 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
19040 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
19050 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
19060 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
19070 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
19080 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
19090 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
190a0 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20  64 jrnlOff;.    
190b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
190c0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
190d0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
190e0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
190f0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
19100 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
19110 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
19120 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
19130 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
19140 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
19150 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
19160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19170 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
19180 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
19190 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
191a0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
191b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
191c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
191d0 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
191e0 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
191f0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
19200 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
19210 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
19220 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
19230 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
19240 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
19250 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
19260 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
19270 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
19280 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
19290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
192a0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
192b0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
192c0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
192d0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
192e0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
192f0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
19300 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
19310 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
19320 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
19330 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
19340 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
19350 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
19360 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
19370 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
19380 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
19390 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
193a0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
193b0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
193c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
193d0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
193e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
193f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19400 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
19410 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
19420 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
19430 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
19440 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
19450 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
19460 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
19470 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
19480 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
19490 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
194a0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
194b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c  ;.    }.    lruL
194c0 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
194d0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
194e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
194f0 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
19500 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
19510 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
19520 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
19530 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
19540 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
19550 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
19560 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
19570 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
19580 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
19590 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
195a0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
195b0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
195c0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
195d0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
195e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
195f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19600 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
19610 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ed==pPager->lru.
19620 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
19630 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
19640 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
19650 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
19660 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
19670 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
19680 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
19690 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
196a0 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
196b0 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
196c0 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
196d0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
196e0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
196f0 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
19700 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
19710 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
19720 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
19730 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
19740 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
19750 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
19760 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
19770 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
19780 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
19790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
197a0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
197b0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
197c0 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
197d0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
197e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
197f0 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
19800 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
19810 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
19820 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19830 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
19840 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
19850 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
19860 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
19870 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
19880 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
19890 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
198a0 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
198b0 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
198c0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
198d0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
198e0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
198f0 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
19900 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
19910 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
19920 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
19930 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
19940 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
19950 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
19960 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
19970 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
19980 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
19990 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
199a0 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
199b0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
199c0 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
199d0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
199e0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
199f0 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
19a00 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
19a10 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
19a20 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
19a30 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
19a40 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
19a50 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
19a60 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
19a70 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
19a80 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
19a90 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
19aa0 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
19ab0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
19ac0 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
19ad0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
19ae0 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
19af0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
19b00 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
19b10 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
19b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19b40 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
19b50 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
19b60 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
19b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19b80 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
19b90 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
19ba0 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
19bb0 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
19bc0 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
19bd0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
19be0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
19bf0 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
19c00 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
19c10 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
19c20 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
19c30 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
19c40 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
19c50 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
19c60 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
19c70 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19c80 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
19c90 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
19ca0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
19cb0 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
19cc0 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
19cd0 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
19ce0 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
19cf0 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19d00 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
19d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
19d20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
19d30 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
19d40 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
19d50 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
19d60 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
19d70 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
19d80 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
19d90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19da0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
19db0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
19dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19dd0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
19de0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
19df0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19e00 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  er;.  PgHdr *p;.
19e10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19e20 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
19e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19e40 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
19e50 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
19e60 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
19e70 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
19e80 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
19e90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19ea0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
19eb0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
19ec0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
19ed0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
19ee0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
19ef0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
19f00 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
19f10 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
19f20 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
19f30 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
19f40 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
19f50 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
19f60 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
19f70 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
19f80 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
19f90 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
19fa0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
19fb0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
19fc0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
19fd0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
19fe0 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
19ff0 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
1a000 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
1a010 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
1a020 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
1a030 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
1a040 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
1a050 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
1a060 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
1a070 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
1a080 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
1a090 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
1a0a0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
1a0b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1a0c0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
1a0d0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
1a0e0 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
1a0f0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1a100 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
1a110 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
1a120 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1a130 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
1a140 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
1a150 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
1a160 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
1a170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1a180 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
1a190 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
1a1a0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
1a1b0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
1a1c0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
1a1d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1a1e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1a1f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1a200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a210 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a220 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
1a230 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
1a240 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28  t(pList);.  for(
1a250 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1a260 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
1a270 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29  sert( p->dirty )
1a280 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d  ;.    p->dirty =
1a290 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
1a2a0 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
1a2b0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1a2c0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
1a2d0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
1a2e0 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
1a2f0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1a300 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
1a310 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
1a320 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
1a330 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1a340 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
1a350 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1a360 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
1a370 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1a380 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1a390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1a3a0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
1a3b0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1a3c0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
1a3d0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
1a3e0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
1a3f0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
1a400 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1a410 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
1a420 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1a430 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1a440 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1a450 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1a460 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1a470 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1a480 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1a490 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1a4a0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
1a4b0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
1a4c0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1a4d0 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
1a4e0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1a4f0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1a500 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
1a510 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1a520 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
1a530 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
1a540 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
1a550 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20  ERTRACE4("STORE 
1a560 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1a570 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1a590 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
1a5a0 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
1a5b0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1a5c0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1a5d0 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
1a5e0 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74  ", pPager, pList
1a5f0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
1a600 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1a610 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1a620 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1a630 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1a640 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1a650 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1a660 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1a670 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1a680 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1a690 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
1a6a0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
1a6b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1a6c0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1a6d0 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
1a6e0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1a6f0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1a700 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
1a710 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
1a720 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1a730 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
1a740 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1a750 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
1a760 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1a770 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
1a780 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1a790 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1a7a0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1a7b0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
1a7c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1a7d0 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
1a7e0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
1a7f0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
1a800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
1a820 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
1a830 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
1a840 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
1a850 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1a860 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
1a870 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
1a880 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
1a890 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
1a8a0 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
1a8b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
1a8c0 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
1a8d0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
1a8e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 23  ger *pPager){..#
1a8f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1a900 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 73 61  /* Verify the sa
1a910 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69 72 74  nity of the dirt
1a920 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20 61  y list when we a
1a930 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20  re running.  ** 
1a940 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f 64  in debugging mod
1a950 65 2e 20 20 54 68 69 73 20 69 73 20 65 78 70 65  e.  This is expe
1a960 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f 74  nsive, so do not
1a970 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f 6e  .  ** do this on
1a980 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1a990 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20 30   */.  int n1 = 0
1a9a0 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b 0a  ;.  int n2 = 0;.
1a9b0 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66 6f    PgHdr *p;.  fo
1a9c0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
1a9d0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
1a9e0 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72 74  ll){ if( p->dirt
1a9f0 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f  y ) n1++; }.  fo
1aa00 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69 72  r(p=pPager->pDir
1aa10 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  ty; p; p=p->pDir
1aa20 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61  ty){ n2++; }.  a
1aa30 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29 3b  ssert( n1==n2 );
1aa40 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1aa50 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  n pPager->pDirty
1aa60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1aa70 6e 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  n 1 if there is 
1aa80 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
1aa90 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
1aaa0 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
1aab0 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
1aac0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1aad0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
1aae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1aaf0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ab00 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
1ab10 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
1ab20 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
1ab30 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
1ab40 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
1ab50 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
1ab60 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
1ab70 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
1ab80 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
1ab90 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1aba0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1abb0 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   if unable to de
1abc0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 74  termine the stat
1abd0 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  us of the journa
1abe0 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  l..**.** This ro
1abf0 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f  utine does not o
1ac00 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1ac10 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
1ac20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  its.** content. 
1ac30 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72   Hence, the jour
1ac40 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1ac50 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1ac60 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1ac70 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  l file that has 
1ac80 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e  been deleted, an
1ac90 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20 68  d hence not be h
1aca0 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68  ot.  Or.** the h
1acb0 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
1acc0 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a 65  rnal might be ze
1acd0 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20  roed out.  This 
1ace0 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
1acf0 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68 65  not discover the
1ad00 73 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e 6f  se cases of a no
1ad10 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20  n-hot journal - 
1ad20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  if the.** journa
1ad30 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1ad40 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 74  d is not empty t
1ad50 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75  his routine assu
1ad60 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74  mes it.** is hot
1ad70 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  .  The pager_pla
1ad80 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1ad90 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
1ada0 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  at the.** journa
1adb0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
1adc0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69 6c  ally hot and wil
1add0 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  l no-op..*/.stat
1ade0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
1adf0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1ae00 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
1ae10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1ae20 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1ae30 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
1ae40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 2a  = SQLITE_OK;.  *
1ae50 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69  pExists = 0;.  i
1ae60 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
1ae70 75 72 6e 61 6c 20 26 26 20 70 50 61 67 65 72 2d  urnal && pPager-
1ae80 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1ae90 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
1aea0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
1aeb0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
1aec0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1aed0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1aee0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1aef0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
1af00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1af10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
1af20 74 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ts ){.      rc =
1af30 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
1af40 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
1af50 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
1af60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1af70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1af80 26 20 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63  & exists && !loc
1af90 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ked ){.      int
1afa0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 63   nPage;.      rc
1afb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1afc0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1afd0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1afe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aff0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
1b000 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1b010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
1b020 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
1b030 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
1b040 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1b050 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 45 78  {.          *pEx
1b060 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
1b070 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b080 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  rc;.}../*.** Try
1b0a0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1b0b0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1b0c0 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
1b0d0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
1b0e0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
1b0f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
1b100 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
1b110 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
1b120 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
1b130 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
1b140 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1b150 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b160 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
1b170 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
1b180 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  pPg){.  PgHdr *p
1b190 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b  Pg;.  *ppPg = 0;
1b1a0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c  ..  /* It is ill
1b1b0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69  egal to call thi
1b1c0 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73  s function unles
1b1d0 73 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  s the pager obje
1b1e0 63 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  ct.  ** pointed 
1b1f0 74 6f 20 62 79 20 70 50 61 67 65 72 20 68 61 73  to by pPager has
1b200 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 72   at least one fr
1b210 65 65 20 70 61 67 65 20 28 70 61 67 65 20 77 69  ee page (page wi
1b220 74 68 20 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a  th nRef==0)..  *
1b230 2f 20 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d  / .  assert(!MEM
1b240 44 42 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  DB);.  assert(pP
1b250 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1b260 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20  );..  /* Find a 
1b270 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
1b280 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
1b290 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
1b2a0 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72   not.  ** requir
1b2b0 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
1b2c0 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
1b2d0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  rnal..  */.  pPg
1b2e0 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70   = pPager->lru.p
1b2f0 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
1b300 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
1b310 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
1b320 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1b330 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
1b340 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
1b350 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
1b360 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1b370 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
1b380 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20  .  ** very slow 
1b390 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
1b3a0 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
1b3b0 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
1b3c0 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63  etimes.  ** it c
1b3d0 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
1b3e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d    */.  if( pPg==
1b3f0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75  0 && pPager->lru
1b400 2e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69  .pFirst ){.    i
1b410 66 28 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43  f( !pPager->errC
1b420 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ode ){.      int
1b430 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1b440 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1b450 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1b460 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  );.      int rc 
1b470 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1b480 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1b490 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1b4a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b4b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b4c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1b4d0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1b4e0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1b4f0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1b500 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
1b510 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
1b520 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
1b530 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  der into the.   
1b540 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1b550 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
1b560 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
1b570 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
1b580 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1b590 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
1b5a0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
1b5b0 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
1b5c0 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20   that have.     
1b5d0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65     ** already be
1b5e0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1b5f0 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
1b600 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
1b610 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  s.        ** tra
1b620 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
1b630 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
1b640 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ted)..        */
1b650 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b660 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1b670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b680 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
1b690 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
1b6a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1b6b0 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
1b6c0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1b6d0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1b6e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b6f0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
1b700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b720 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70     }.    pPg = p
1b730 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1b740 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
1b750 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
1b760 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
1b770 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
1b780 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
1b790 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
1b7a0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1b7b0 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 72  y && !pPager->er
1b7c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  rCode ){.    int
1b7d0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
1b7e0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
1b7f0 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  0 );.    makeCle
1b800 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
1b810 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1b820 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1b830 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1b840 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1b850 20 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d   pPg );.    pPg-
1b860 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1b870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b880 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1b890 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1b8a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
1b8b0 69 72 74 79 3d 3d 30 20 7c 7c 20 70 50 61 67 65  irty==0 || pPage
1b8c0 72 2d 3e 65 72 72 43 6f 64 65 20 29 3b 0a 0a 20  r->errCode );.. 
1b8d0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
1b8e0 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
1b8f0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
1b900 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
1b910 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
1b920 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
1b930 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
1b940 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
1b950 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1b960 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
1b970 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
1b980 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
1b990 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1b9a0 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
1b9b0 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
1b9c0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
1b9d0 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
1b9e0 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
1b9f0 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
1ba00 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
1ba10 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
1ba20 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
1ba30 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
1ba40 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
1ba50 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
1ba60 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
1ba70 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
1ba80 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
1ba90 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
1baa0 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
1bab0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
1bac0 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
1bad0 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
1bae0 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
1baf0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
1bb00 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1bb10 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
1bb20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
1bb30 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
1bb40 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
1bb50 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
1bb60 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
1bb70 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
1bb80 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
1bb90 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
1bba0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bbb0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1bbc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1bbd0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f  ORY_MANAGEMENT./
1bbe0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bbf0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1bc00 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
1bc10 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
1bc20 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
1bc30 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
1bc40 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
1bc50 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
1bc60 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
1bc70 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
1bc80 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
1bc90 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66  may be sqlite3_f
1bca0 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
1bcb0 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
1bcc0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
1bcd0 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
1bce0 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
1bcf0 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
1bd00 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
1bd10 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65   returns. The re
1bd20 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1bd30 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
1bd40 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
1bd50 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
1bd60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1bd70 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  gerReleaseMemory
1bd80 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e  (int nReq){.  in
1bd90 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b  t nReleased = 0;
1bda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1bdb0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1bdc0 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  eased so far */.
1bdd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bdf0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1be00 72 20 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75  r pagers */.  Bu
1be10 73 79 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64  syHandler *saved
1be20 42 75 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76  Busy;     /* Sav
1be30 65 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62  ed copy of the b
1be40 75 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20  usy handler */. 
1be50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1be60 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69  _OK;..  /* Acqui
1be70 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61  re the memory-ma
1be80 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20  nagement mutex. 
1be90 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1bea0 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20  TE_MUTEX_NOOP.  
1beb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
1bec0 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a 20 54  utex;       /* T
1bed0 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f  he MEM2 mutex */
1bee0 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  .  mutex = sqlit
1bef0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1bf00 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1bf10 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  _MEM2);.#endif. 
1bf20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1bf30 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20  nter(mutex);..  
1bf40 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61  /* Signal all da
1bf50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1bf60 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d  ns that memory m
1bf70 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a  anagement wants.
1bf80 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63 63    ** to have acc
1bf90 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ess to the pager
1bfa0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  s..  */.  for(pP
1bfb0 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65  ager=sqlite3Page
1bfc0 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70  rList; pPager; p
1bfd0 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
1bfe0 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65  ext){.     pPage
1bff0 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b  r->iInUseMM = 1;
1c000 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
1c010 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c020 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65  (nReq<0 || nRele
1c030 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20  ased<nReq) ){.  
1c040 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1c050 20 20 50 67 48 64 72 20 2a 70 52 65 63 79 63 6c    PgHdr *pRecycl
1c060 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79  ed;. .    /* Try
1c070 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1c080 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61 74 20  to recycle that 
1c090 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1c0a0 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a 20 20   a sync(). If.  
1c0b0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74    ** this is not
1c0c0 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64 20   possible, find 
1c0d0 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 72 65  one that does re
1c0e0 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e 0a  quire a sync()..
1c0f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1c100 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1c110 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1c120 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1c130 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20  ATIC_LRU));.    
1c140 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75  pPg = sqlite3Lru
1c150 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53  PageList.pFirstS
1c160 79 6e 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65  ynced;.    while
1c170 28 20 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e  ( pPg && (pPg->n
1c180 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e  eedSync || pPg->
1c190 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
1c1a0 29 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d  ) ){.      pPg =
1c1b0 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78   pPg->gfree.pNex
1c1c0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1c1d0 20 21 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70   !pPg ){.      p
1c1e0 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50  Pg = sqlite3LruP
1c1f0 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a  ageList.pFirst;.
1c200 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67        while( pPg
1c210 20 26 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   && pPg->pPager-
1c220 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20  >iInUseDB ){.   
1c230 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1c240 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20  gfree.pNext;.   
1c250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1c260 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1c270 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
1c280 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1c290 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1c2a0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d  .    /* If pPg==
1c2b0 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63  0, then the bloc
1c2c0 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c  k above has fail
1c2d0 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ed to find a pag
1c2e0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79  e to.    ** recy
1c2f0 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  cle. In this cas
1c300 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d  e return early -
1c310 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f   no further memo
1c320 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ry will.    ** b
1c330 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20  e released..    
1c340 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 20  */.    if( !pPg 
1c350 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50  ) break;..    pP
1c360 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c370 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21  er;.    assert(!
1c380 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1c390 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1c3a0 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61  u.pFirst);.    a
1c3b0 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53  ssert(pPg->needS
1c3c0 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1c3d0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1c3e0 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61  nced);.  .    sa
1c3f0 76 65 64 42 75 73 79 20 3d 20 70 50 61 67 65 72  vedBusy = pPager
1c400 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->pBusyHandler;.
1c410 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1c420 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20  yHandler = 0;.  
1c430 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1c440 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52  ycle(pPager, &pR
1c450 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50  ecycled);.    pP
1c460 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1c470 65 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a  er = savedBusy;.
1c480 20 20 20 20 61 73 73 65 72 74 28 70 52 65 63 79      assert(pRecy
1c490 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21  cled==pPg || rc!
1c4a0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20  =SQLITE_OK);.   
1c4b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c4c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  OK ){.      /* W
1c4d0 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67  e've found a pag
1c4e0 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68  e to free. At th
1c4f0 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67  is point the pag
1c500 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20  e has been .    
1c510 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f    ** removed fro
1c520 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d  m the page hash-
1c530 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74  table, free-list
1c540 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74   and synced-list
1c550 20 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72   .      ** (pFir
1c560 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73  stSynced). It is
1c570 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c   still in the al
1c580 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c  l pages (pAll) l
1c590 69 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52  ist. .      ** R
1c5a0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
1c5b0 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66  is list before f
1c5c0 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a  reeing..      **
1c5d0 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20  .      ** Todo: 
1c5e0 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
1c5f0 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
1c600 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
1c610 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a  Ok. It .      **
1c620 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f   probably is tho
1c630 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ugh..      */.  
1c640 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b      PgHdr *pTmp;
1c650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c660 50 67 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg );.      if( 
1c670 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pPg==pPager->pAl
1c680 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 61 73  l ){.         as
1c690 73 65 72 74 28 70 50 67 2d 3e 70 50 72 65 76 41  sert(pPg->pPrevA
1c6a0 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll==0);.        
1c6b0 20 61 73 73 65 72 74 28 70 50 67 2d 3e 70 4e 65   assert(pPg->pNe
1c6c0 78 74 41 6c 6c 3d 3d 30 20 7c 7c 20 70 50 67 2d  xtAll==0 || pPg-
1c6d0 3e 70 4e 65 78 74 41 6c 6c 2d 3e 70 50 72 65 76  >pNextAll->pPrev
1c6e0 41 6c 6c 3d 3d 70 50 67 29 3b 0a 20 20 20 20 20  All==pPg);.     
1c6f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
1c700 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
1c710 3b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70  ;.         if( p
1c720 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1c730 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c740 2d 3e 70 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c  ->pAll->pPrevAll
1c750 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 7d   = 0;.         }
1c760 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
1c780 67 2d 3e 70 50 72 65 76 41 6c 6c 29 3b 0a 20 20  g->pPrevAll);.  
1c790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
1c7a0 67 2d 3e 70 50 72 65 76 41 6c 6c 2d 3e 70 4e 65  g->pPrevAll->pNe
1c7b0 78 74 41 6c 6c 3d 3d 70 50 67 29 3b 0a 20 20 20  xtAll==pPg);.   
1c7c0 20 20 20 20 20 20 70 54 6d 70 20 3d 20 70 50 67        pTmp = pPg
1c7d0 2d 3e 70 50 72 65 76 41 6c 6c 3b 0a 20 20 20 20  ->pPrevAll;.    
1c7e0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
1c7f0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
1c800 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 69 66  All;.         if
1c810 28 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ( pTmp->pNextAll
1c820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
1c830 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 2d 3e 70  Tmp->pNextAll->p
1c840 50 72 65 76 41 6c 6c 20 3d 20 70 54 6d 70 3b 0a  PrevAll = pTmp;.
1c850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c860 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65 61 73   }.      nReleas
1c870 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20  ed += (.        
1c880 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b    sizeof(*pPg) +
1c890 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c8a0 65 0a 20 20 20 20 20 20 20 20 20 20 2b 20 73 69  e.          + si
1c8b0 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
1c8c0 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
1c8d0 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
1c8e0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a  eof(PgHistory) .
1c8f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49        );.      I
1c900 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
1c910 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67  %p %d *\n", pPag
1c920 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
1c930 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c940 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1c950 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20  pgfree_count);. 
1c960 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1c970 46 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  Free(pPg->pData)
1c980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1c990 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1c9a0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
1c9b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c9c0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
1c9d0 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
1c9e0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
1c9f0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
1ca00 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
1ca10 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
1ca20 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
1ca30 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
1ca40 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
1ca50 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
1ca60 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
1ca70 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
1ca80 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
1ca90 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72  .      ** The er
1caa0 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
1cab0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
1cac0 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
1cad0 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 2a  he case .      *
1cae0 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
1caf0 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
1cb00 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
1cb10 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
1cb20 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
1cb30 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20      assert(.    
1cb40 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29 3d        (rc&0xff)=
1cb50 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
1cb60 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53  .          rc==S
1cb70 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
1cb80 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1cb90 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29 3b  TE_BUSY.      );
1cba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cbb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1cbc0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1cbd0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
1cbe0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1cbf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1cc00 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20  lear the memory 
1cc10 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73  management flags
1cc20 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1cc30 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f   mutex.  */.  fo
1cc40 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33  r(pPager=sqlite3
1cc50 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65  PagerList; pPage
1cc60 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72  r; pPager=pPager
1cc70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70  ->pNext){.     p
1cc80 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20  Pager->iInUseMM 
1cc90 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1cca0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
1ccb0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  utex);..  /* Ret
1ccc0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ccd0 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65 64  f bytes released
1cce0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  .  */.  return n
1ccf0 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
1cd00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
1cd10 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1cd20 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
1cd30 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1cd40 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74   of page pPg out
1cd50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cd60 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
1cd70 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1cd80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1cd90 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20  gHdr *pPg, Pgno 
1cda0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pgno){.  int rc;
1cdb0 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20  .  i64 offset;. 
1cdc0 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
1cdd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  0 );.  assert(pP
1cde0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1cdf0 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
1ce00 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50  File);.  if( !pP
1ce10 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1ce20 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ds ){.    return
1ce30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1ce40 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  ORT_READ;.  }.  
1ce50 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1ce60 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1ce70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
1ce80 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1ce90 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
1cea0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1ceb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1cec0 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
1ced0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1cee0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1cef0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1cf00 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1cf10 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1cf20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cf30 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
1cf40 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1cf50 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1cf60 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
1cf70 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  8*)PGHDR_TO_DATA
1cf80 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20  (pPg))[24],.    
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1cfc0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1cfd0 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44  ers));.  }.  COD
1cfe0 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC1(pPager, PGHD
1cff0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1d000 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
1d010 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45   PAGERTRACE4("FE
1d020 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1d030 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1d050 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1d060 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
1d070 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
1d080 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1d090 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d0a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1d0b0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
1d0c0 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
1d0d0 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
1d0e0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
1d0f0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1d100 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
1d110 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
1d120 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
1d130 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1d140 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1d150 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
1d160 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
1d170 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
1d180 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
1d190 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
1d1a0 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
1d1b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
1d1c0 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
1d1d0 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
1d1e0 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
1d1f0 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
1d200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d210 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1d220 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d240 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72  E_OK;.  int isEr
1d250 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20  rorReset = 0;.. 
1d260 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
1d270 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
1d280 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
1d290 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
1d2a0 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
1d2b0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
1d2c0 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
1d2d0 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74  -state, now is t
1d2e0 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65  he chance to cle
1d2f0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
1d300 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
1d310 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
1d320 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
1d330 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
1d340 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
1d350 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
1d360 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
1d370 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
1d380 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
1d390 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1d3a0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1d3b0 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  de ){.    if( pP
1d3c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1d3d0 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  n ){.      isErr
1d3e0 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
1d3f0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
1d400 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
1d410 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
1d420 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
1d430 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
1d440 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
1d450 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
1d460 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
1d470 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
1d480 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
1d490 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
1d4a0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1d4b0 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
1d4c0 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
1d4d0 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
1d4e0 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
1d4f0 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
1d500 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1d510 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
1d520 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
1d530 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
1d540 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1d550 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
1d560 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1d570 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
1d580 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
1d590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1d5a0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1d5b0 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21  >pVfs;.    if( !
1d5c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69  MEMDB ){.      i
1d5d0 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 3b  nt isHotJournal;
1d5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d5f0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
1d600 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1d610 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1d620 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d630 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1d640 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
1d650 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
1d660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d690 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1d6a0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  OCK );.         
1d6b0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d6c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d6d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d6e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d6f0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
1d700 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
1d710 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
1d720 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
1d730 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
1d740 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
1d750 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
1d760 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d770 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
1d780 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
1d790 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
1d7a0 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
1d7b0 20 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72        if( !isErr
1d7c0 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  orReset ){.     
1d7d0 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
1d7e0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69  urnal(pPager, &i
1d7f0 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sHotJournal);.  
1d800 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d820 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1d830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d840 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
1d850 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73  ErrorReset || is
1d860 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
1d870 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1d880 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1d890 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d8a0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1d8b0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1d8c0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1d8d0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1d8e0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1d8f0 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1d900 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d910 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1d920 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1d930 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1d940 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1d950 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d960 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1d970 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1d980 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1d990 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d9a0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1d9b0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1d9c0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1d9d0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1d9e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1d9f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1da00 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1da10 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1da20 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1da30 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1da40 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1da50 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1da60 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1da70 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1da80 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1da90 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1daa0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
1dab0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1dac0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1dad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1dae0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1daf0 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
1db00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1db10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1db20 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1db30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1db40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1db50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1db60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1db70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1db80 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1db90 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1dba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1dbb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1dbc0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1dbd0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20  LUSIVE;.        
1dbe0 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  }. .        /* O
1dbf0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1dc00 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
1dc10 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
1dc20 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
1dc30 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
1dc40 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1dc50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1dc60 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
1dc70 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
1dc80 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
1dc90 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
1dca0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
1dcb0 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
1dcc0 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
1dcd0 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
1dce0 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
1dcf0 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
1dd00 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
1dd10 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
1dd20 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
1dd30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1dd40 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
1dd50 65 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  et && pPager->jo
1dd60 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a  urnalOpen==0 ){.
1dd70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
1dd80 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  s;.          rc 
1dd90 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1dda0 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
1ddb0 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
1ddc0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65  CCESS_EXISTS,&re
1ddd0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
1dde0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ddf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1de00 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
1de10 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
1de20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1de30 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
1de40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1de50 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
1de60 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
1de70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1de80 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1de90 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
1dea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1deb0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1dec0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1ded0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
1dee0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
1def0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1df00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1df10 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
1df20 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20  hods );.        
1df30 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53        if( fout&S
1df40 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1df50 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
1df60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1df70 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1df80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1df90 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1dfa0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
1dfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dfc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dfd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1dfe0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
1dff0 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65  t exist, that me
1e000 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ans some other p
1e010 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20  rocess.         
1e020 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65       ** has alre
1e030 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61  ady rolled it ba
1e040 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ck */.          
1e050 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e060 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1e070 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1e080 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e0b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e0c0 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
1e0d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
1e0e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20   .           && 
1e0f0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1e100 5f 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20 20  _NOMEM .        
1e110 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1e120 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1e130 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
1e140 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
1e150 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
1e160 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e170 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
1e180 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e190 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1e1a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1e1b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1e1c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1e1d0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
1e1e0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
1e1f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1e200 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a   0;. .        /*
1e210 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
1e220 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1e230 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
1e240 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
1e250 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
1e260 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
1e270 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  d lock..        
1e280 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1e290 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
1e2a0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
1e2b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e2d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
1e2e0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1e2f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
1e300 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
1e310 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e320 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1e330 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
1e340 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
1e350 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1e360 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
1e370 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
1e380 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1e390 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
1e3a0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
1e3b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1e3c0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
1e3d0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
1e3e0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1e3f0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  e file.        *
1e400 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
1e410 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
1e420 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
1e430 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1e440 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
1e450 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1e460 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
1e470 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1e480 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20  .        ** has 
1e490 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
1e4a0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1e4b0 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
1e4c0 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  sh the.        *
1e4d0 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20  * cache..       
1e4e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   **.        ** D
1e4f0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
1e500 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
1e510 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
1e520 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
1e530 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
1e540 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
1e550 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
1e560 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
1e570 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
1e580 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
1e590 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
1e5a0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
1e5b0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
1e5c0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
1e5d0 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
1e5e0 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
1e5f0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
1e600 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64          ** a cod
1e610 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
1e620 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
1e630 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
1e640 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1e650 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
1e660 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
1e670 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  be .        ** d
1e680 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
1e690 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
1e6a0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
1e6b0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
1e6c0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
1e6d0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
1e6e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e6f0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
1e700 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
1e710 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
1e720 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1e730 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1e740 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 20  er, 0);..       
1e750 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1e760 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
1e770 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1e780 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
1e790 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1e7a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1e7b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1e7c0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
1e7d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1e7e0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1e7f0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1e800 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1e810 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e820 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1e830 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1e840 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1e850 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1e860 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e880 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1e890 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ed;.          }.
1e8a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e8b0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1e8c0 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
1e8d0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1e8e0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
1e8f0 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d         if( memcm
1e900 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
1e910 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1e920 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1e930 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
1e940 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1e950 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1e960 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e970 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1e980 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1e990 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
1e9a0 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41  state<=PAGER_SHA
1e9b0 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1e9c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1e9d0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1e9e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1e9f0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1ea00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61  ;.    }.  }.. fa
1ea10 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
1ea20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ea30 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
1ea40 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
1ea50 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
1ea60 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
1ea70 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
1ea80 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1ea90 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
1eaa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1eab0 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64   Allocate a PgHd
1eac0 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68  r object.   Eith
1ead0 65 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  er create a new 
1eae0 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20  one or reuse.** 
1eaf0 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20  an existing one 
1eb00 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65  that is not othe
1eb10 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a  rwise in use..**
1eb20 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20  .** A new PgHdr 
1eb30 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
1eb40 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  ated if any of t
1eb50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1eb60 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  .** true:.**.** 
1eb70 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1eb80 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75   not exceeded ou
1eb90 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61  r maximum alloca
1eba0 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  ted cache size.*
1ebb0 2a 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65  *          as se
1ebc0 74 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41  t by the "PRAGMA
1ebd0 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d   cache_size" com
1ebe0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
1ebf0 28 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (2)  There are n
1ec00 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f  o unused PgHdr o
1ec10 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65  bjects available
1ec20 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a   at this time..*
1ec30 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68  *.**     (3)  Th
1ec40 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1ec50 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1ec60 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72  **     (4)  Ther
1ec70 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f  e are no PgHdr o
1ec80 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e  bjects that do n
1ec90 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ot require a jou
1eca0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
1ecb0 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61   file sync and a
1ecc0 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75   sync of the jou
1ecd0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72  rnal file is cur
1ece0 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1ecf0 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a     prohibited..*
1ed00 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ed10 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
1ed20 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68  g PgHdr.  In oth
1ed30 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20  er words, reuse 
1ed40 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50  an.** existing P
1ed50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74  gHdr if all of t
1ed60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ed70 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1ed80 20 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65   (1)  We have re
1ed90 61 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65  ached or exceede
1eda0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61  d the maximum ca
1edb0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
1edc0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20       allowed by 
1edd0 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69  "PRAGMA cache_si
1ede0 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ze"..**.**     (
1edf0 32 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50  2)  There is a P
1ee00 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77  gHdr available w
1ee10 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d  ith PgHdr->nRef=
1ee20 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  =0.**.**     (3)
1ee30 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20    We are not in 
1ee40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1ee50 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  abase.**.**     
1ee60 28 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72  (4)  Either ther
1ee70 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c  e is an availabl
1ee80 65 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65  e PgHdr that doe
1ee90 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20  s not need.**   
1eea0 20 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e         to be syn
1eeb0 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65  ced to disk or e
1eec0 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67  lse disk syncing
1eed0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1eee0 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1eef0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1ef00 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1ef10 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1ef20 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1ef30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ef40 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
1ef50 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  pPg;.  int nByte
1ef60 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  Hdr;..  /* Creat
1ef70 65 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66  e a new PgHdr if
1ef80 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72   any of the four
1ef90 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69   conditions defi
1efa0 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  ned .  ** above 
1efb0 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66  are met: */.  if
1efc0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
1efd0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20  pPager->mxPage. 
1efe0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75    || pPager->lru
1eff0 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  .pFirst==0 .   |
1f000 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
1f010 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1f020 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50  tSynced==0 && pP
1f030 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29  ager->doNotSync)
1f040 0a 20 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  .  ){.    void *
1f050 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 70  pData;.    if( p
1f060 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50  Pager->nPage>=pP
1f070 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20  ager->nHash ){. 
1f080 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a       pager_resiz
1f090 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61  e_hash_table(pPa
1f0a0 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50  ger,.         pP
1f0b0 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20  ager->nHash<256 
1f0c0 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e  ? 256 : pPager->
1f0d0 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20  nHash*2);.      
1f0e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  if( pPager->nHas
1f0f0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
1f100 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1f110 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
1f120 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1f130 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1f140 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  }.    pagerLeave
1f150 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42  (pPager);.    nB
1f160 79 74 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28  yteHdr = sizeof(
1f170 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75  *pPg) + sizeof(u
1f180 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
1f190 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
1f1a0 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
1f1b0 66 28 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20  f(PgHistory);.  
1f1c0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4d    pPg = sqlite3M
1f1d0 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20  alloc( nByteHdr 
1f1e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29  );.    if( pPg )
1f1f0 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  {.      pData = 
1f200 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
1f210 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
1f220 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
1f230 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20   pData==0 ){.   
1f240 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1f250 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1f260 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  pPg = 0;.      }
1f270 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1f280 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1f290 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
1f2a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1f2b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1f2c0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1f2d0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
1f2e0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
1f2f0 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20 20 20  , nByteHdr);.   
1f300 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20 70 44   pPg->pData = pD
1f310 61 74 61 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  ata;.    pPg->pP
1f320 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
1f330 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
1f340 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
1f350 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f360 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1f370 41 47 45 4d 45 4e 54 0a 20 20 20 20 69 66 28 20  AGEMENT.    if( 
1f380 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  pPg->pNextAll ){
1f390 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
1f3a0 74 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d  tAll->pPrevAll =
1f3b0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   pPg;.    }.#end
1f3c0 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
1f3d0 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
1f3e0 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
1f3f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f400 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
1f410 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
1f420 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
1f430 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1f440 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1f450 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1f460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1f470 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f480 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
1f490 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KED;.    }.    i
1f4a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f4b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1f4c0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1f4d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
1f4e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1f4f0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1f500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
1f510 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
1f520 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
1f530 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
1f540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f550 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1f560 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ave the content 
1f570 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
1f580 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
1f590 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
1f5a0 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
1f5b0 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  nt==1, then the 
1f5c0 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a  content was.** j
1f5d0 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ust initialized 
1f5e0 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64  to zeros instead
1f5f0 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
1f600 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74  rom disk..** But
1f610 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65   now we need the
1f620 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f   real data off o
1f630 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65  f disk.  So make
1f640 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65   sure we.** have
1f650 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e   it.  Read it in
1f660 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   if we do not ha
1f670 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a  ve it already..*
1f680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f690 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50  er_get_content(P
1f6a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
1f6b0 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20  ( pPg->needRead 
1f6c0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
1f6d0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
1f6e0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
1f6f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
1f700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f710 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
1f720 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1f730 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1f740 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1f750 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f760 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1f770 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
1f780 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
1f790 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
1f7a0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
1f7b0 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
1f7c0 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
1f7d0 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
1f7e0 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
1f7f0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1f800 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
1f810 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1f820 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
1f830 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
1f840 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
1f850 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1f860 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
1f870 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1f880 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
1f890 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
1f8a0 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
1f8b0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
1f8c0 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
1f8d0 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
1f8e0 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
1f8f0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
1f900 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
1f910 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
1f920 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
1f930 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
1f940 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
1f950 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
1f960 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
1f970 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
1f980 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
1f990 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
1f9a0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
1f9b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1f9c0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f9d0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1f9e0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
1f9f0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1fa00 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
1fa10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1fa20 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
1fa30 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
1fa40 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
1fa50 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
1fa60 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
1fa70 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1fa80 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
1fa90 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
1faa0 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
1fab0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
1fac0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
1fad0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
1fae0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
1faf0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
1fb00 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
1fb10 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
1fb20 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
1fb30 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
1fb40 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
1fb50 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
1fb60 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
1fb70 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
1fb80 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
1fb90 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
1fba0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
1fbb0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  es..**.** If noC
1fbc0 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  ontent is false,
1fbd0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1fbe0 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
1fbf0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1fc00 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1fc10 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
1fc20 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
1fc30 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1fc40 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
1fc50 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
1fc60 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  time, so do not 
1fc70 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20  do a disk read. 
1fc80 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
1fc90 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e  e.** page conten
1fca0 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42  t with zeros.  B
1fcb0 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74  ut mark the fact
1fcc0 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
1fcd0 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f  t read the.** co
1fce0 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67  ntent by setting
1fcf0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1fd00 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72  ead flag.  Later
1fd10 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69   on, if .** sqli
1fd20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1fd30 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  is called on thi
1fd40 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69  s page or if thi
1fd50 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
1fd60 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74  called again wit
1fd70 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20  h noContent==0, 
1fd80 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1fd90 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  the content is n
1fda0 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  eeded.** and the
1fdb0 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c   disk read shoul
1fdc0 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
1fdd0 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1fde0 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
1fdf0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1fe00 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1fe10 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1fe20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fe30 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1fe40 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1fe50 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1fe60 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1fe70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1fe80 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1fe90 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1fea0 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1feb0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1fec0 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1fed0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1fee0 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1fef0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1ff00 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1ff10 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ff20 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
1ff30 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
1ff40 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
1ff50 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
1ff60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1ff70 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
1ff80 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
1ff90 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
1ffa0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1ffb0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
1ffc0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
1ffd0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
1ffe0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
1fff0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
20000 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
20010 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
20020 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20030 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
20040 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
20050 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
20060 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
20070 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
20080 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
20090 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  *ppPage = 0;..  
200a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
200b0 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
200c0 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
200d0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
200e0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
200f0 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
20100 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
20110 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
20120 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
20130 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
20140 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
20150 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
20160 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
20170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
20190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
201a0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
201b0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d  LOCK );..  pPg =
201c0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
201d0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
201e0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
201f0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
20200 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
20210 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
20220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
20230 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  ;.    int h;.   
20240 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
20250 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
20260 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61  rc = pagerAlloca
20270 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20 26  tePage(pPager, &
20280 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
20290 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
202a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
202b0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
202c0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
202d0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
202e0 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  || pgno>pPager->
202f0 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  stmtSize );.    
20300 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
20310 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
20320 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
20330 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
20340 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
20350 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65 43 6c  = 0;..    makeCl
20360 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
20370 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20 20  g->nRef = 1;..  
20380 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
20390 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
203a0 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
203b0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
203c0 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
203d0 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
203e0 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
203f0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
20400 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20410 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
20420 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20440 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20450 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
20460 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
20470 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
20480 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61  the page with da
20490 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65  ta, either by re
204a0 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
204b0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
204c0 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69  ile, or by setti
204d0 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
204e0 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ge to zero..    
204f0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  */.    if( nMax<
20500 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
20510 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74  DB || (noContent
20520 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77   && !pPager->alw
20530 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a  aysRollback) ){.
20540 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
20550 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
20560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20570 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
20580 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20590 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
205a0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
205b0 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
205c0 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
205d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
205e0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
205f0 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21  = noContent && !
20600 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
20610 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f  llback;.      IO
20620 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
20630 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
20640 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
20650 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
20660 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
20670 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
20680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20690 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
206a0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
206b0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
206c0 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
206d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
206e0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
206f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
20710 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
20720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
20730 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
20740 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
20750 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
20760 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
20770 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
20780 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
20790 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
207a0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
207b0 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
207c0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
207d0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
207e0 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
207f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
20800 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
20810 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
20820 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
20830 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
20840 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
20850 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
20860 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
20870 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
20880 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
20890 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
208a0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
208b0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
208c0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
208d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
208e0 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
208f0 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
20900 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
20910 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
20920 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
20930 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
20940 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
20950 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
20960 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20980 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
20990 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
209a0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
209b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
209c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
209d0 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
209e0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
209f0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
20a00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20a10 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
20a20 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
20a30 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
20a40 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
20a50 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
20a60 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
20a70 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
20a80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
20a90 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
20aa0 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
20ab0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
20ac0 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
20ad0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
20ae0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
20af0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
20b00 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
20b10 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  pgno, ppPage, no
20b20 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65  Content);.  page
20b30 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20b50 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
20b60 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
20b70 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
20b80 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
20b90 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
20ba0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
20bb0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
20bc0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
20bd0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
20be0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
20bf0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
20c00 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
20c10 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
20c20 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
20c30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
20c40 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
20c50 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
20c60 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
20c70 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
20c80 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
20c90 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
20ca0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
20cb0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
20cc0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
20cd0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
20ce0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
20cf0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
20d00 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
20d10 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
20d20 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
20d30 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
20d40 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
20d50 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
20d60 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  *pPg = 0;..  ass
20d70 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
20d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
20d90 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45  !=0 );..  pagerE
20da0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
20db0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20dc0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
20dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
20de0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
20df0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
20e00 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65  eMode );.  }else
20e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20e20 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
20e30 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
20e40 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44  FULL ){.    /* D
20e50 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
20e60 65 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20  else if( (pPg = 
20e70 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
20e80 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29  ger, pgno))!=0 )
20e90 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  {.    page_ref(p
20ea0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
20eb0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20ec0 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
20ed0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
20ee0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
20ef0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
20f00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
20f10 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
20f20 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
20f30 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
20f40 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
20f50 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
20f60 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
20f70 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
20f80 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
20f90 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
20fa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20fb0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
20fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20fd0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
20fe0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
20ff0 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 67  ager;..  if( pPg
21000 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
21010 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
21020 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
21030 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
21040 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
21050 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
21060 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
21070 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
21080 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
21090 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  ->pPager);.  pPg
210a0 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45  ->nRef--;..  CHE
210b0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
210c0 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
210d0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
210e0 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
210f0 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
21100 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
21110 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
21120 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
21130 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
21140 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  nRef==0 ){..    
21150 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
21160 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21170 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
21180 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
21190 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
211a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
211b0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
211c0 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
211d0 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
211e0 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
211f0 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
21200 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
21210 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
21220 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
21230 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21240 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
21250 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21260 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
21270 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
21280 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
21290 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
212a0 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
212b0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
212c0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
212d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
212e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
212f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21300 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
21310 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
21320 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
21330 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
21340 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
21350 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
21360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21370 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
21380 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
21390 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
213a0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
213b0 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
213c0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
213d0 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
213e0 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
213f0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
21400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21410 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
21420 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
21430 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
21440 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
21450 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  >pVfs;.  int fla
21460 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
21470 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
21480 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
21490 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
214a0 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63  EATE);..  int rc
214b0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
214c0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
214d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
214e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
214f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21500 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
21510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21520 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
21530 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
21540 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
21550 65 72 2c 20 30 29 3b 0a 20 20 70 61 67 65 72 4c  er, 0);.  pagerL
21560 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
21570 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21580 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
21590 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
215a0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65  >dbSize);.  page
215b0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
215c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
215d0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
215e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
215f0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
21600 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
21610 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  urnal;.  }..  if
21620 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21630 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  lOpen==0 ){.    
21640 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
21650 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c  File ){.      fl
21660 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
21670 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
21680 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
21690 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
216a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c   }else{.      fl
216b0 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
216c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
216d0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
216e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
216f0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72  OMIC_WRITE.    r
21700 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
21710 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
21720 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
21730 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
21740 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
21750 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
21760 72 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  r).    );.#else.
21770 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21780 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
21790 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
217a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
217b0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
217c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
217d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
217e0 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
217f0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
21800 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
21810 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
21820 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
21830 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21840 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
21850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21860 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21870 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
21880 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
21890 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
218a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
218b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
218c0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
218d0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
218e0 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
218f0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
21900 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
21910 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
21920 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
21930 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
21940 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
21950 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
21960 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
21970 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21980 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
21990 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
219a0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
219b0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
219c0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
219d0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
219e0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
219f0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
21a00 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
21a10 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
21a20 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
21a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21a40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21a50 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
21a60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
21a70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
21a80 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
21a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
21aa0 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
21ab0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
21ac0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
21ad0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21af0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21b00 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
21b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
21b20 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
21b30 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
21b40 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
21b50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21b60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
21b70 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
21b80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21b90 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
21ba0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
21bb0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
21bc0 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
21bd0 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
21be0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
21bf0 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
21c00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
21c10 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
21c20 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
21c30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
21c40 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
21c50 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
21c60 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
21c70 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
21c80 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
21c90 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
21ca0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
21cb0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
21cc0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
21cd0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
21ce0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
21cf0 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
21d00 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
21d10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21d20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
21d30 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
21d40 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
21d50 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
21d60 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
21d70 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
21d80 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
21d90 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
21da0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
21db0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21dc0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
21dd0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
21de0 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
21df0 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
21e00 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
21e10 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
21e20 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
21e30 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21e40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
21e50 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
21e60 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
21e70 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
21e80 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
21e90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
21ea0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
21eb0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
21ec0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
21ed0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
21ee0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
21ef0 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
21f00 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
21f10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
21f20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
21f30 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
21f40 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
21f50 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
21f60 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
21f70 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
21f80 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
21f90 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
21fa0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
21fb0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
21fc0 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
21fd0 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
21fe0 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
21ff0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
22000 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
22010 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
22020 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
22030 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
22040 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
22050 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
22060 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
22070 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
22080 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
22090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
220a0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
220b0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
220c0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
220d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
220e0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
220f0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
22100 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
22110 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
22120 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22130 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
22140 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
22150 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
22160 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
22170 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
22180 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
22190 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
221a0 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
221b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
221c0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
221d0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
221e0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
221f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22200 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22210 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
22220 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
22230 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
22240 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
22250 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
22260 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
22270 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
22280 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
222a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  OK ){.        pa
222b0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
222c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
222d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
222e0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
222f0 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
22300 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
22310 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
22320 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
22340 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
22350 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
22360 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  File.           
22370 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
22380 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
22390 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
223a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
223b0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
223c0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
223d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
223e0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
223f0 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
22400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
22410 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
22420 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
22430 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
22440 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
22450 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
22460 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
22470 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
22480 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
22490 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
224a0 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
224b0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
224c0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
224d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
224e0 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
224f0 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
22500 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
22510 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
22520 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
22530 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
22540 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
22550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
22560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
22570 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
22580 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
22590 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
225a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
225b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
225c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
225d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
225e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 61 67 65  er, 0);.    page
225f0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
22600 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
22610 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
22620 42 69 74 76 65 63 43 72 65 61 74 65 28 20 70 50  BitvecCreate( pP
22630 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
22640 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70      pagerEnter(p
22650 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
22660 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
22670 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
22680 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
22690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
226a0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
226b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
226c0 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
226d0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
226e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
226f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
22700 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22710 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
22720 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
22730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
22740 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
22750 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
22760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
22770 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
22780 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
22790 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
227a0 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
227b0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
227c0 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
227d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
227e0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
227f0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
22800 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
22810 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64  ager;.    pPg->d
22820 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
22830 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
22840 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  er->pDirty;.    
22850 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72  if( pPager->pDir
22860 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ty ){.      pPag
22870 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  er->pDirty->pPre
22880 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  vDirty = pPg;.  
22890 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72    }.    pPg->pPr
228a0 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  evDirty = 0;.   
228b0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
228c0 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
228d0 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
228e0 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74  clean.  Clear it
228f0 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20  s dirty bit and 
22900 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
22910 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
22920 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
22930 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
22940 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
22950 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
22960 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
22970 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67  = 0;.    if( pPg
22980 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
22990 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
229a0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
229b0 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  y==pPg );.      
229c0 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  pPg->pDirty->pPr
229d0 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  evDirty = pPg->p
229e0 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d  PrevDirty;.    }
229f0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
22a00 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20  revDirty ){.    
22a10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
22a20 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
22a30 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  y==pPg );.      
22a40 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
22a50 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
22a60 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
22a70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22a80 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
22a90 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
22aa0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
22ab0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
22ac0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
22ad0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
22ae0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
22af0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
22b00 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
22b10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
22b20 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
22b30 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
22b40 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
22b50 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
22b60 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
22b70 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
22b80 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
22b90 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
22ba0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
22bb0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
22bc0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
22bd0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
22be0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
22bf0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
22c00 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
22c10 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
22c20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
22c30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
22c40 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
22c50 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
22c60 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
22c70 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
22c80 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
22c90 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
22ca0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
22cb0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
22cc0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
22cd0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
22ce0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
22cf0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
22d00 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
22d10 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
22d20 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
22d30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
22d40 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
22d50 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
22d60 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
22d70 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
22d80 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
22d90 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
22da0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
22db0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
22dc0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
22dd0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
22de0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
22df0 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
22e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
22e10 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
22e20 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
22e30 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
22e40 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
22e50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
22e60 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
22e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22e80 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
22e90 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
22ea0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22eb0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
22ec0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
22ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
22ee0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
22ef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22f00 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
22f10 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
22f20 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
22f30 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
22f40 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
22f50 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ge was previousl
22f60 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
22f70 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
22f80 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65  at means.  ** we
22f90 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72   didn't really r
22fa0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ead in the conte
22fb0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
22fc0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
22fd0 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70  .  ** (for examp
22fe0 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67  le) when the pag
22ff0 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64  e is being moved
23000 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
23010 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20  .  But.  ** now 
23020 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29  we are (perhaps)
23030 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65   moving the page
23040 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65   off of the free
23050 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65  list for.  ** re
23060 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20  use and we need 
23070 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67  to know its orig
23080 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20  inal content so 
23090 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  that content.  *
230a0 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  * can be stored 
230b0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
230c0 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20  journal.  So do 
230d0 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73  the read at this
230e0 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f  .  ** time..  */
230f0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65  .  rc = pager_ge
23100 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
23110 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23120 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23130 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
23140 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
23150 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
23160 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
23170 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
23180 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
23190 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
231a0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
231b0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
231c0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
231d0 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74  l && (pageInStat
231e0 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
231f0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
23200 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
23210 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
23220 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  1;.    pPager->d
23230 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
23240 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
23250 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
23260 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
23270 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
23280 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
23290 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
232a0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
232b0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
232c0 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
232d0 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
232e0 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
232f0 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
23300 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23310 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
23320 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
23330 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
23340 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
23350 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23360 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
23370 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
23380 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
23390 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
233a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
233b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
233c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
233d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
233e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
233f0 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
23400 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
23410 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
23420 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
23430 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
23440 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
23450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
23460 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
23470 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
23480 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
23490 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
234a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
234b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
234c0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
234d0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
234e0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
234f0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
23500 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
23510 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
23520 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
23530 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
23540 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
23550 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
23560 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
23570 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
23580 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
23590 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
235a0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
235b0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
235c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
235d0 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
235e0 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  && (pPager->jour
235f0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42  nalOpen || MEMDB
23600 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
23610 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
23620 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
23630 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
23640 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
23650 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
23660 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
23670 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
23680 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
23690 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
236a0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
236b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
236c0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
236d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
236e0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
236f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
23700 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
23710 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
23720 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23730 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
23740 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  f( !pHist->pOrig
23750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
23770 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
23780 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
23790 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
237a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
237b0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
237c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
237d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
237e0 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
237f0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
23800 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  2;..          /*
23810 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
23820 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
23830 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
23840 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
23850 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
23860 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
23870 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
23880 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
23890 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
238a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
238b0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
238c0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
238d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
238e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
238f0 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
23900 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
23910 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
23920 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
23930 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
23940 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
23950 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  2);.          rc
23960 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
23970 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
23980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
23990 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
239a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
239b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
239c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
239d0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
239e0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
239f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23a30 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
23a40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
23a50 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
23a60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
23a70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23a80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
23ab0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
23ac0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
23ad0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
23ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
23af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23b00 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
23b10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54   }.          IOT
23b20 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
23b30 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
23b40 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
23b50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23b60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23b70 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
23b80 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
23b90 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
23ba0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
23bb0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
23bc0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
23bd0 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE5("JOURNAL %d
23be0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
23bf0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
23c00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23c10 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
23c20 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
23c30 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61  Pg->needSync, pa
23c40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
23c50 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ));..          /
23c60 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
23c70 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74  ccured writing t
23c80 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
23c90 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
23ca0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
23cb0 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
23cc0 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
23cd0 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
23ce0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
23cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23d20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
23d30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
23d40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ++;.          as
23d50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
23d60 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
23d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d80 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
23d90 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
23da0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
23db0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
23dc0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
23dd0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
23de0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
23df0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
23e00 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
23e10 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
23e20 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
23e30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
23e50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
23e60 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
23e70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
23e80 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
23e90 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
23ea0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
23eb0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
23ec0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23ef0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
23f00 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
23f10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
23f20 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
23f30 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
23f40 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
23f50 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
23f60 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
23f70 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
23f80 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
23f90 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
23fa0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
23fb0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
23fc0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
23fd0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
23fe0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
23ff0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
24000 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
24010 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
24020 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
24030 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
24040 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
24050 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
24060 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
24070 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
24080 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
24090 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
240a0 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
240b0 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
240c0 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
240d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
240e0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
240f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
24100 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
24110 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
24120 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
24130 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
24140 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
24150 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
24160 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
24170 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
24180 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
24190 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
241a0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
241b0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
241c0 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
241d0 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  oc( pPager->page
241e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
241f0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
24200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
24210 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
24220 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
24230 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
24240 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
24250 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
24260 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
24270 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
24280 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
24290 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
242a0 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
242b0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
242c0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pPg);.      }els
242d0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f  e{.        i64 o
242e0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
242f0 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67  stmtNRec*(4+pPag
24300 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
24310 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
24320 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
24330 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
24340 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
24350 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
24360 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64  its(pPager->stfd
24370 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
24380 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
24390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
243a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
243b0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
243c0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
243d0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
243e0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
243f0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  4);.        }.  
24400 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
24410 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
24420 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
24430 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
24440 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
24450 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24490 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
244a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
244b0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  rt( pPager->pInS
244c0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
244d0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
244e0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  et(pPager->pInSt
244f0 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
24500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24510 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
24520 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
24530 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
24540 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24550 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
24560 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
24570 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
24580 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
24590 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
245a0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
245b0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
245c0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
245d0 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
245e0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
245f0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
24600 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
24610 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24620 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24630 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
24640 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
24650 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
24660 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
24670 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
24680 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
24690 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
246a0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
246b0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
246c0 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
246d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
246e0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
246f0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
24700 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
24710 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
24720 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
24730 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
24740 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
24750 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
24760 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
24770 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
24780 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
24790 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
247a0 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
247b0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
247c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
247d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
247e0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
247f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24800 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
24810 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
24820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
24830 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
24840 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
24850 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
24860 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
24870 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
24880 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
24890 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
248a0 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ize);..  pagerEn
248b0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
248c0 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61  f( !MEMDB && nPa
248d0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
248e0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
248f0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
24900 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
24910 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
24920 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
24930 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
24940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
24950 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
24960 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
24970 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
24980 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
24990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
249a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
249b0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
249c0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
249d0 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
249e0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
249f0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
24a00 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
24a10 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
24a20 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
24a30 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
24a40 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
24a50 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
24a60 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
24a70 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
24a80 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
24a90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24aa0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
24ab0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
24ac0 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
24ad0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
24ae0 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
24af0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
24b00 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
24b10 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
24b20 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
24b30 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
24b40 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
24b50 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
24b60 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
24b70 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
24b80 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
24b90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
24ba0 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
24bb0 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
24bc0 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
24bd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
24be0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
24bf0 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
24c00 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  unt);.    if( pP
24c10 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
24c20 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
24c30 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
24c40 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
24c50 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
24c60 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
24c70 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
24c80 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
24c90 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
24ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
24cb0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
24cc0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
24cd0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
24ce0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
24cf0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
24d00 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
24d10 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
24d20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
24d30 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
24d40 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
24d50 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
24d60 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
24d70 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
24d80 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
24d90 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
24da0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24db0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24dc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
24dd0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
24de0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
24df0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24e00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
24e10 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
24e20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
24e50 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
24e60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24e70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
24e80 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
24e90 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
24ea0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
24eb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
24ec0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24ed0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
24ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24ef0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
24f00 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
24f10 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
24f20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24f30 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  if( pPage->needS
24f40 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
24f50 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
24f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24f70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
24f80 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
24f90 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
24fa0 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
24fb0 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
24fc0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
24fd0 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
24fe0 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
24ff0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
25000 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
25010 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
25020 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
25030 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
25040 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
25050 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
25060 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
25070 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
25080 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
25090 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
250a0 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
250b0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
250c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
250d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
250e0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
250f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
25100 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
25110 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
25120 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
25130 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
25140 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
25150 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20      if( pPage ) 
25160 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
25170 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
25180 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
25190 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
251a0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
251b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
251c0 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
251d0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
251e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
251f0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
25200 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
25210 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25220 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
25230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
25240 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
25250 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
25260 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
25270 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
25280 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
25290 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
252a0 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
252b0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
252c0 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
252d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
252e0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
252f0 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
25300 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25310 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
25320 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
25330 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
25340 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
25350 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
25360 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
25370 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
25380 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
25390 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
253a0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
253b0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
253c0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
253d0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
253e0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
253f0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
25400 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
25410 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
25420 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
25430 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
25440 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
25450 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
25460 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
25470 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
25480 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
25490 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
254a0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
254b0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
254c0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
254d0 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
254e0 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
254f0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
25500 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
25510 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
25520 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
25530 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
25540 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
25550 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
25560 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
25570 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
25580 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25590 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
255a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
255b0 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
255c0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
255d0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
255e0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
255f0 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
25600 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
25610 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
25620 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
25630 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
25640 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
25650 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
25660 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
25670 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
25680 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
25690 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
256a0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
256b0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
256c0 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
256d0 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
256e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
256f0 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
25700 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
25710 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
25720 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
25730 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
25740 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
25750 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
25760 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
25770 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
25780 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25790 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
257a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
257b0 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
257c0 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
257d0 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
257e0 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
257f0 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
25800 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
25810 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
25820 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
25830 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
25840 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
25850 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
25860 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
25870 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25880 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
25890 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
258a0 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rn;.  pagerEnter
258b0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d  (pPager);.  pPg-
258c0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
258d0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
258e0 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72  dirty && !pPager
258f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
25900 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25910 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
25920 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
25930 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
25940 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
25950 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
25960 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
25970 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
25980 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
25990 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
259a0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
259b0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
259c0 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
259d0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
259e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
259f0 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
25a00 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
25a10 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
25a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25a30 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
25a40 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
25a50 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
25a60 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
25a70 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
25a80 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
25a90 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
25aa0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
25ab0 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
25ac0 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
25ad0 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
25ae0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
25af0 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
25b00 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
25b10 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
25b20 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
25b30 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
25b40 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
25b50 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
25b60 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
25b70 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
25b80 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
25b90 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
25ba0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
25bb0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
25bc0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
25bd0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
25be0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
25bf0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
25c00 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
25c10 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
25c20 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
25c30 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
25c40 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
25c50 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
25c60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
25c70 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
25c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
25c90 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
25ca0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
25cb0 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
25cc0 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
25cd0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
25ce0 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
25cf0 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
25d00 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
25d10 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
25d20 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
25d30 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
25d40 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
25d50 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
25d60 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  k journal..**.**
25d70 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
25d80 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61  yet actually rea
25d90 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
25da0 20 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a   this page (if.*
25db0 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  * the PgHdr.need
25dc0 52 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74  Read flag is set
25dd0 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
25de0 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72  ine acts as a pr
25df0 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65  omise.** that we
25e00 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64   will never need
25e10 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
25e20 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65  e content in the
25e30 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74   future..** so t
25e40 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67  he needRead flag
25e50 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
25e60 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
25e70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25e80 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
25e90 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
25ea0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25eb0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
25ec0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
25ed0 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
25ee0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
25ef0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a  ER_RESERVED );..
25f00 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
25f10 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
25f20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69  open, or DontWri
25f30 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  te() has been ca
25f40 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69  lled on.  ** thi
25f50 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74  s page (DontWrit
25f60 65 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77  e() sets the alw
25f70 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
25f80 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a  ), then this.  *
25f90 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
25fa0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
25fb0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
25fc0 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d  lOpen==0 || pPg-
25fd0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
25fe0 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
25ff0 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
26000 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
26010 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  er);.    return;
26020 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
26030 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46  MEMDB );    /* F
26040 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67  or a memdb, pPag
26050 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
26060 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a  is always 0 */..
26070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
26080 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66  CURE_DELETE.  if
26090 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
260a0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
260b0 6e 6f 20 3e 20 70 50 61 67 65 72 2d 3e 6f 72 69  no > pPager->ori
260c0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  gDbSize ){.    r
260d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
260e0 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52  f..  /* If SECUR
260f0 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61  E_DELETE is disa
26100 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
26110 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
26120 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  this.  ** routin
26130 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
26140 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68  on a page for wh
26150 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72  ich sqlite3Pager
26160 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a  DontWrite().  **
26170 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
26180 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
26190 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
261a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
261b0 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69  * And if DontWri
261c0 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75  te() has previou
261d0 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  sly been called,
261e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
261f0 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d   ** conditions m
26200 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a  ust be met..  **
26210 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20  .  ** (Later:)  
26220 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68  Not true.  If th
26230 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
26240 72 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e  rrupted by havin
26250 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a  g duplicate.  **
26260 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
26270 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72  eelist (ex: corr
26280 75 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20  upt9.test) then 
26290 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
262a0 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
262b0 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f  arily true:.  */
262c0 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70  .  /* assert( !p
262d0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
262e0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
262f0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
26300 62 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61  bSize ); */..  a
26310 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
26320 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
26330 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
26340 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
26350 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
26360 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  );.  pPg->inJour
26370 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67 2d 3e  nal = 1;.  pPg->
26380 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
26390 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
263a0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
263b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
263c0 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  tSize >= pPager-
263d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
263e0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
263f0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  Set(pPager->pInS
26400 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  tmt, pPg->pgno);
26410 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43  .  }.  PAGERTRAC
26420 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
26430 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
26440 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
26450 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
26460 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52  .  IOTRACE(("GAR
26470 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  BAGE %p %d\n", p
26480 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
26490 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  )).  pagerLeave(
264a0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
264b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
264c0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
264d0 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
264e0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
264f0 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
26500 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
26510 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
26520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26530 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
26540 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
26550 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
26560 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ect){.  PgHdr *p
26570 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
26580 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
26590 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
265a0 4b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  K;..#ifndef SQLI
265b0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
265c0 5f 57 52 49 54 45 0a 20 20 61 73 73 65 72 74 28  _WRITE.  assert(
265d0 20 69 73 44 69 72 65 63 74 3d 3d 30 20 29 3b 20   isDirect==0 ); 
265e0 20 2f 2a 20 69 73 44 69 72 65 63 74 20 69 73 20   /* isDirect is 
265f0 6f 6e 6c 79 20 74 72 75 65 20 66 6f 72 20 61 74  only true for at
26600 6f 6d 69 63 20 77 72 69 74 65 73 20 2a 2f 0a 23  omic writes */.#
26610 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 61  endif.  if( !pPa
26620 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
26630 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
26640 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
26650 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
26660 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
26670 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26680 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
26690 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
266a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
266b0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
266c0 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
266d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
266e0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
266f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
26700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26720 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
26730 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26740 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26750 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
26760 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
26770 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
26780 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
26790 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
267a0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
267b0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
267c0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
267d0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
267e0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
267f0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
26800 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
26810 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
26820 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
26830 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26840 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
26850 49 54 45 0a 20 20 20 20 69 66 28 20 69 73 44 69  ITE.    if( isDi
26860 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rect && pPager->
26870 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
26880 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
26890 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54   *zBuf = PGHDR_T
268a0 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a  O_DATA(pPgHdr);.
268b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
268c0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
268d0 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
268e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
268f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
26900 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
26910 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
26920 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
26930 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
26940 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
26950 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
26960 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
26970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26980 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
26990 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ile to disk..*/.
269a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
269b0 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
269c0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
269d0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
269e0 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
269f0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26a00 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
26a10 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70 61 67  nc_flags);.  pag
26a20 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
26a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26a40 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
26a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
26a60 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
26a70 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
26a80 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
26a90 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
26aa0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
26ab0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
26ac0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
26ad0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
26ae0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
26af0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
26b00 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
26b10 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
26b20 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
26b30 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
26b40 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
26b50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
26b60 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
26b70 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
26b80 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
26b90 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
26ba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26bb0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
26bc0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
26bd0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
26be0 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
26bf0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
26c00 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
26c10 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
26c20 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
26c30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
26c40 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
26c50 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
26c60 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
26c70 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
26c80 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
26c90 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
26ca0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
26cb0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26cc0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
26cd0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
26ce0 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
26cf0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
26d00 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
26d10 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
26d20 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
26d30 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
26d40 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
26d50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
26d60 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
26d70 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
26d80 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
26d90 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
26da0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
26db0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
26dc0 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
26dd0 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
26de0 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
26df0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26e00 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
26e10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
26e20 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
26e30 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
26e40 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
26e50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26e60 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
26e70 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
26e80 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
26e90 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f  zMaster, .  Pgno
26ea0 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   nTrunc,.  int n
26eb0 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72  oSync.){.  int r
26ec0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
26ed0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
26ee0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
26ef0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26f00 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
26f10 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 68 61 76  f no changes hav
26f20 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 77 65 20  e been made, we 
26f30 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20 74 72  can leave the tr
26f40 61 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e  ansaction early.
26f50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
26f60 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
26f70 30 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50  0 &&.        (pP
26f80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
26f90 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
26fa0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20  MODE_DELETE ||. 
26fb0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
26fc0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d  >exclusiveMode!=
26fd0 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
26fe0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
26ff0 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
27000 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
27010 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
27020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
27030 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44    PAGERTRACE4("D
27040 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
27050 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
27060 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
27070 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
27080 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
27090 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67  , nTrunc);.  pag
270a0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
270b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
270c0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
270d0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
270e0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
270f0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
27100 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
27110 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
27120 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
27130 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
27140 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
27150 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
27160 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
27170 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
27180 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69   PgHdr *pPg;..#i
27190 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
271a0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
271b0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69      /* The atomi
271c0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
271d0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
271e0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20   if all of the. 
271f0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
27200 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
27210 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
27220 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
27230 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
27240 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
27250 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
27260 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
27270 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20  age-size, and.  
27280 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63    **    + This c
27290 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
272a0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
272b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
272c0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45  nd.    **    + E
272d0 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
272e0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
272f0 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
27300 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
27310 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27320 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
27330 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
27340 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
27350 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
27360 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74  .    ** be creat
27370 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
27380 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
27390 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69      int useAtomi
273a0 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20  cWrite = (.     
273b0 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a     !zMaster && .
273c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
273d0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20  journalOpen &&. 
273e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
273f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
27400 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
27410 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54  ) && .        nT
27420 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20  runc==0 && .    
27430 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e      (0==pPager->
27440 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61  pDirty || 0==pPa
27450 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69  ger->pDirty->pDi
27460 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  rty).    );.    
27470 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27480 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
27490 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
274a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
274b0 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20  LMODE_OFF );.   
274c0 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72   if( useAtomicWr
274d0 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ite ){.      /* 
274e0 55 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  Update the nRec 
274f0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75  field in the jou
27500 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
27510 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d      int offset =
27520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27530 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
27540 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
27550 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
27560 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20  ->nRec==1);.    
27570 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
27580 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
27590 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e  offset, pPager->
275a0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nRec);..      /*
275b0 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
275c0 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
275d0 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
275e0 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69  g call will modi
275f0 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  fy.      ** the 
27600 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
27610 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
27620 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68   1 to include th
27630 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 20 20  e updated.      
27640 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
27650 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
27660 20 70 61 67 65 20 31 20 64 69 72 65 63 74 6c 79   page 1 directly
27670 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27680 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  .      ** file. 
27690 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
276a0 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
276b0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
276c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20   file-system, . 
276d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
276e0 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  safe..      */. 
276f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27710 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
27720 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
27730 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
27740 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27760 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
27770 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
27780 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65   }..    if( !use
27790 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72  AtomicWrite && r
277a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23  c==SQLITE_OK ).#
277b0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
277c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
277d0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
277e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
277f0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
27800 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
27810 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
27820 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
27830 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
27840 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
27850 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
27860 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
27870 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
27880 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
27890 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
278a0 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
278b0 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
278c0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
278d0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
278e0 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
278f0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
27900 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
27910 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
27920 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
27930 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
27940 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
27950 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
27960 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
27970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27980 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
27990 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
279a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
279b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
279c0 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  OFF ){.#ifndef S
279d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
279e0 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66  ACUUM.        if
279f0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
27a00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
27a10 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
27a20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
27a30 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
27a40 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
27a50 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
27a60 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
27a70 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
27a80 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
27a90 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
27aa0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
27ab0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
27ac0 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
27ad0 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69          int iSki
27ae0 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
27af0 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  O(pPager);.     
27b00 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
27b10 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
27b20 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
27b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27b40 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
27b50 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
27b60 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
27b70 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
27b80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
27b90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
27ba0 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
27bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27bd0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
27be0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
27bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27c00 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
27c20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
27c30 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
27c40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27c50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
27c60 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
27c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
27c80 20 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64   .        }.#end
27c90 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  if.        rc = 
27ca0 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
27cb0 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
27cc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
27cd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27ce0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
27cf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 79  .        rc = sy
27d00 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
27d10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27d20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27d30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
27d40 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65  nc_exit;..#ifnde
27d50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27d60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
27d70 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
27d80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27d90 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
27da0 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
27db0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27dc0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
27dd0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
27de0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
27df0 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
27e00 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
27e10 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
27e20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
27e30 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
27e40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
27e50 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
27e60 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
27e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
27e90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
27ea0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a  OERR_BLOCKED );.
27eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72        /* The err
27ec0 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65  or might have le
27ed0 66 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  ft the dirty lis
27ee0 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20  t all fouled up 
27ef0 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62  here,.      ** b
27f00 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ut that does not
27f10 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20   matter because 
27f20 69 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69  if the if the di
27f30 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20  rty list did.   
27f40 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70     ** get corrup
27f50 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72  ted, then the tr
27f60 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72  ansaction will r
27f70 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20  oll back and.   
27f80 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68     ** discard th
27f90 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54  e dirty list.  T
27fa0 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72  here is an asser
27fb0 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  t in.      ** pa
27fc0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
27fd0 79 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76  y_pages() that v
27fe0 65 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20  erifies that no 
27ff0 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a  attempt.      **
28000 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20   is made to use 
28010 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79  an invalid dirty
28020 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a   list..      */.
28030 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f        goto sync_
28040 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
28050 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
28060 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   0;..    /* Sync
28070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28080 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
28090 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
280a0 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
280b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
280c0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
280d0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
280e0 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
280f0 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
28100 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28110 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
28120 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
28130 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CED;.  }else if(
28140 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63   MEMDB && nTrunc
28150 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
28160 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
28170 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
28180 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
28190 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
281a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
281b0 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
281c0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
281d0 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
281e0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
281f0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
28200 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c    * lock to spil
28210 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
28220 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
28230 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
28240 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73  .     * there is
28250 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
28260 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
28270 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20  tent, it is.    
28280 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74   * better to ret
28290 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
282a0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  .     */.    rc 
282b0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
282c0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
282d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
282e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
282f0 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
28300 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
28310 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
28320 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
28330 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
28340 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
28350 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
28360 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
28370 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
28380 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
28390 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
283a0 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
283b0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
283c0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
283d0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
283e0 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a  PhaseTwo(Pager *
283f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
28400 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
28410 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
28420 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
28430 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
28440 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
28450 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
28460 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
28470 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28480 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
28490 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
284a0 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20  dified==0 &&.   
284b0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f       (pPager->jo
284c0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
284d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
284e0 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ETE ||.         
284f0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
28500 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20  veMode!=0) ){.  
28510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28520 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
28530 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
28540 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
28550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28560 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  K;.  }.  pagerEn
28570 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50  ter(pPager);.  P
28580 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d  AGERTRACE2("COMM
28590 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
285a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
285b0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
285c0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
285d0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
285e0 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
285f0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
28600 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
28610 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
28620 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
28630 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
28640 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
28650 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
28660 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
28670 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
28680 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
28690 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
286a0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
286b0 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
286c0 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
286d0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
286e0 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
286f0 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ty;.    }.    pP
28700 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
28710 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
28720 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
28730 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
28740 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
28750 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
28760 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
28770 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
28780 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
28790 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
287a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
287b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
287c0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
287d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
287e0 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
287f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
28800 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
28810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
28820 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
28830 44 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76  D;.    pagerLeav
28840 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
28850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28860 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
28870 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
28880 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70  GER_SYNCED || !p
28890 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
288a0 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  e );.  rc = page
288b0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
288c0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
288d0 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
288e0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
288f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
28900 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
28910 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
28920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
28930 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
28940 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
28950 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
28960 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
28970 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
28980 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
28990 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
289a0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
289b0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
289c0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
289d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
289e0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
289f0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
28a00 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
28a10 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
28a20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
28a30 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
28a40 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
28a50 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
28a60 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
28a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28a80 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
28a90 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
28aa0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
28ab0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
28ac0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
28ad0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
28ae0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
28af0 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
28b00 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
28b10 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
28b20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
28b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
28b40 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
28b50 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28b60 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  rc;.  PAGERTRACE
28b70 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
28b80 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28b90 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
28ba0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
28bb0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
28bc0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
28bd0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
28be0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
28bf0 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
28c00 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
28c10 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
28c20 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
28c30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28c40 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
28c50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
28c60 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
28c70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
28c80 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
28c90 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
28ca0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
28cb0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
28cc0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
28cd0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
28ce0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
28cf0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
28d00 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
28d10 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
28d20 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
28d30 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
28d40 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28d50 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ze);.        PAG
28d60 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41  ERTRACE3("ROLLBA
28d70 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
28d80 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
28d90 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
28da0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28db0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
28dc0 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
28dd0 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
28de0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
28df0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
28e00 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
28e10 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
28e20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
28e30 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
28e40 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
28e50 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
28e60 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
28e70 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
28e80 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
28e90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
28ea0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
28eb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
28ec0 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65  einiter(p, pPage
28ed0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
28ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28ef0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
28f00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
28f10 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
28f20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
28f30 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
28f40 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ze;.    pager_tr
28f50 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
28f60 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
28f70 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
28f80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
28f90 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
28fa0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
28fb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
28fc0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28fd0 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r);.  if( !pPage
28fe0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
28ff0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
29000 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
29010 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
29020 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
29030 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
29040 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  r);.    pagerLea
29050 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
29060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
29070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
29080 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
29090 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
290a0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
290b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
290c0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
290d0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
290e0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
290f0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  0);.    }.    pa
29100 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
29110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  ;.    return pPa
29120 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
29130 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
29140 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
29150 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
29160 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
29170 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
29180 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63  ager, 0);.    rc
29190 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
291a0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
291b0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
291c0 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
291d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
291e0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
291f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
29200 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
29210 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
29220 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72  ;.  }.  /* pager
29230 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20  _reset(pPager); 
29240 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
29250 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20  ize = -1;..  /* 
29260 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
29270 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
29280 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
29290 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
292a0 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68   pager.  ** cach
292b0 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72  e. So call pager
292c0 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20  _error() on the 
292d0 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20  way out to make 
292e0 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  any error .  ** 
292f0 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  persistent..  */
29300 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72  .  rc = pager_er
29310 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
29320 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
29330 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
29340 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
29350 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
29360 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
29370 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
29380 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
29390 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
293a0 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
293b0 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
293c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
293d0 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  Isreadonly(Pager
293e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
293f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
29400 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Only;.}../*.** R
29410 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
29420 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
29430 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  o the pager..*/.
29440 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29450 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  Refcount(Pager *
29460 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
29470 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  n pPager->nRef;.
29480 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
29490 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
294a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
294b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
294c0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
294d0 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
294e0 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
294f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
29500 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
29510 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
29520 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
29530 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
29540 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
29550 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
29560 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29570 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
29580 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
29590 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
295a0 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
295b0 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
295c0 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
295d0 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
295e0 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
295f0 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
29600 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
29610 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
29620 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
29630 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20  return a;.}.int 
29640 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65  sqlite3PagerIsMe
29650 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  mdb(Pager *pPage
29660 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d  r){.  return MEM
29670 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  DB;.}.#endif../*
29680 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
29690 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
296a0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
296b0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
296c0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
296d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
296e0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
296f0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
29700 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
29710 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
29720 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
29730 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
29740 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
29750 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
29760 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
29770 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
29780 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74  ic int pagerStmt
29790 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
297a0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
297b0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
297c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
297d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
297e0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
297f0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
29800 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
29810 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
29820 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
29830 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
29840 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
29850 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
29860 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
29870 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
29880 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
29890 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
298a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
298b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
298c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
298d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
298e0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
298f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29900 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
29910 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
29920 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
29930 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
29940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29950 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
29960 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
29970 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69  Stmt = sqlite3Bi
29980 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
29990 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61  r->dbSize);.  pa
299a0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
299b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
299c0 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  pInStmt==0 ){.  
299d0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
299e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
299f0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
29a00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29a10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
29a20 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
29a30 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
29a40 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
29a50 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
29a60 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
29a70 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
29a80 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
29a90 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
29aa0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
29ab0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
29ac0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
29ad0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
29ae0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
29af0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 53 51  pPager->stfd, SQ
29b00 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
29b10 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72  RNAL);.    if( r
29b20 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
29b30 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
29b40 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
29b50 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
29b60 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
29b70 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
29b80 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
29b90 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
29ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
29bb0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
29bc0 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
29bd0 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >pInStmt ){.    
29be0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
29bf0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
29c00 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
29c10 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->pInStmt = 0;.
29c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29c30 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
29c40 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
29c50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
29c60 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
29c70 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
29c80 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67  c = pagerStmtBeg
29c90 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  in(pPager);.  pa
29ca0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
29cb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29cc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
29cd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
29ce0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
29cf0 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  tmtCommit(Pager 
29d00 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65  *pPager){.  page
29d10 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
29d20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
29d30 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
29d40 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
29d50 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  t;.    PAGERTRAC
29d60 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
29d70 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29d80 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
29d90 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
29da0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
29db0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
29dc0 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
29dd0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
29de0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
29df0 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50  nStmt);.      pP
29e00 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20  ager->pInStmt = 
29e10 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
29e20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
29e30 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
29e40 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
29e50 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
29e60 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
29e70 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
29e80 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
29e90 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
29ea0 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  tmt;.        ass
29eb0 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74  ert( pHist->inSt
29ec0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  mt );.        pH
29ed0 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
29ee0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
29ef0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
29f00 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
29f10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29f20 33 50 61 67 65 46 72 65 65 28 70 48 69 73 74 2d  3PageFree(pHist-
29f30 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
29f40 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
29f50 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
29f60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
29f70 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
29f80 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
29f90 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
29fa0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
29fb0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
29fc0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  utoopen = 0;.  p
29fd0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
29fe0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29ff0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a000 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
2a010 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
2a020 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
2a030 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
2a040 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
2a050 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
2a060 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
2a070 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
2a080 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
2a090 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
2a0a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a0b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
2a0c0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
2a0d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
2a0e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
2a0f0 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  st;.      for(pP
2a100 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
2a110 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d   pPg; pPg=pHist-
2a120 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
2a130 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
2a140 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
2a150 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
2a160 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
2a170 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
2a180 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
2a190 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
2a1a0 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
2a1b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2a1c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2a1d0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
2a1e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
2a1f0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
2a200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a210 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2a220 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
2a230 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
2a240 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
2a250 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
2a260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a270 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
2a280 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2a290 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
2a2a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
2a2b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
2a2c0 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
2a2d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2a2e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2a2f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
2a300 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
2a310 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
2a320 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
2a330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2a340 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
2a350 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2a360 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
2a370 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
2a380 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
2a390 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a3a0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
2a3b0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
2a3c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
2a3d0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
2a3e0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
2a3f0 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
2a400 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
2a410 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a420 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2a430 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
2a440 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
2a450 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
2a460 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
2a470 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
2a480 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
2a490 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
2a4a0 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
2a4b0 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
2a4c0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
2a4d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
2a4e0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
2a4f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a500 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
2a510 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
2a520 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
2a530 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a540 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2a550 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
2a560 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20  erDirname(Pager 
2a570 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2a580 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
2a590 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
2a5a0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
2a5b0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
2a5c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
2a5d0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2a5e0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
2a5f0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2a600 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2a610 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
2a620 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a630 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
2a640 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
2a650 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
2a660 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
2a670 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
2a680 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
2a690 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
2a6a0 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
2a6b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a6c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2a6d0 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
2a6e0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
2a6f0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ODEC./*.** Set t
2a700 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
2a710 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
2a720 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
2a730 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
2a740 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
2a750 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
2a760 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
2a770 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
2a780 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
2a790 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
2a7a0 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
2a7b0 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
2a7c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
2a7d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a7e0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
2a7f0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
2a800 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
2a810 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
2a820 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
2a830 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
2a840 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
2a850 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
2a860 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
2a870 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
2a880 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
2a890 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
2a8a0 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
2a8b0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
2a8c0 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20  revious located 
2a8d0 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  at pgno is not a
2a8e0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65  lready.** in the
2a8f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2a900 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74  l, it is not put
2a910 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69   there by by thi
2a920 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
2a930 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
2a940 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61  he page pPg rema
2a950 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
2a960 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
2a970 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
2a980 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61  ith pPg (i.e. da
2a990 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
2a9a0 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
2a9b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
2a9c0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
2a9d0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
2a9e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
2a9f0 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
2aa00 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
2aa10 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
2aa20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2aa30 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
2aa40 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
2aa50 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
2aa60 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
2aa70 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
2aa80 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
2aa90 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
2aaa0 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
2aab0 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
2aac0 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
2aad0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
2aae0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2aaf0 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e)..**.** If the
2ab00 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
2ab10 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e  , isCommit, is n
2ab20 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
2ab30 69 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  is page is being
2ab40 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72  .** moved as par
2ab50 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
2ab60 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a  reorganization j
2ab70 75 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74  ust before the t
2ab80 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69  ransaction .** i
2ab90 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
2aba0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
2abb0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2abc0 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
2abd0 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67  ase page .** pPg
2abe0 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20   refers to will 
2abf0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  not be written t
2ac00 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  o again within t
2ac10 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
2ac20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2ac30 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
2ac40 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
2ac50 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
2ac60 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  no, int isCommit
2ac70 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
2ac80 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ld;  /* The page
2ac90 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2aca0 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a  en. */.  int h;.
2acb0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
2acc0 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65  gno = 0;..  page
2acd0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
2ace0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
2acf0 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
2ad00 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
2ad10 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
2ad20 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
2ad30 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
2ad40 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2ad50 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
2ad60 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
2ad70 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
2ad80 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
2ad90 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
2ada0 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
2adb0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
2adc0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2add0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
2ade0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
2adf0 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
2ae00 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
2ae10 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
2ae20 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
2ae30 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
2ae40 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
2ae50 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
2ae60 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
2ae70 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
2ae80 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2ae90 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
2aea0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
2aeb0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
2aec0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
2aed0 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
2aee0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
2aef0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
2af00 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
2af10 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
2af20 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
2af30 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 26   pPg->needSync &
2af40 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  & !isCommit ){. 
2af50 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
2af60 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
2af70 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
2af80 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
2af90 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
2afa0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
2afb0 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
2afc0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
2afd0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2afe0 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
2aff0 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
2b000 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  ts hash-chain */
2b010 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
2b020 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
2b030 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2b040 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
2b050 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
2b060 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
2b070 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
2b080 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
2b090 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
2b0a0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
2b0b0 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
2b0c0 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
2b0d0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
2b0e0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
2b0f0 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
2b100 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
2b110 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
2b120 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  .  pPg->needSync
2b130 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d   = 0;.  pPgOld =
2b140 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2b150 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
2b160 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
2b170 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
2b180 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
2b190 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
2b1a0 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
2b1b0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
2b1c0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d  PgOld);.    pPg-
2b1d0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f  >needSync = pPgO
2b1e0 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20  ld->needSync;.  
2b1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
2b200 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
2b210 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  }.  pPg->inJourn
2b220 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
2b230 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2b240 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2b250 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  ;..  /* Change t
2b260 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
2b270 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
2b280 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
2b290 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
2b2a0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
2b2b0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
2b2c0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
2b2d0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
2b2e0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
2b2f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2b300 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2b310 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2b320 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
2b330 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
2b340 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
2b350 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
2b360 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
2b370 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2b380 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
2b390 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
2b3a0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
2b3b0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
2b3c0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
2b3d0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
2b3e0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2b3f0 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
2b400 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
2b410 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
2b420 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
2b430 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
2b440 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
2b450 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
2b460 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
2b470 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
2b480 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
2b490 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
2b4a0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
2b4b0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
2b4c0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
2b4d0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
2b4e0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
2b4f0 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
2b500 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
2b510 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
2b520 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
2b530 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
2b540 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
2b550 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
2b560 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
2b570 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
2b580 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
2b590 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2b5a0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
2b5b0 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
2b5c0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
2b5d0 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
2b5e0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
2b5f0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
2b600 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
2b610 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
2b620 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
2b630 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
2b640 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
2b650 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
2b660 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
2b670 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
2b680 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
2b690 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
2b6a0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
2b6b0 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
2b6c0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
2b6d0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
2b6e0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
2b6f0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
2b700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
2b710 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
2b720 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
2b730 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b740 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2b750 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
2b760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
2b770 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
2b780 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
2b790 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
2b7a0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
2b7b0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
2b7c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
2b7d0 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
2b7e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b7f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2b800 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2b810 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
2b820 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
2b830 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2b850 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b860 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53  al && (int)needS
2b870 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
2b880 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
2b890 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
2b8a0 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
2b8b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
2b8c0 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20  edSyncPgno);.   
2b8d0 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
2b8e0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
2b8f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b900 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
2b910 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
2b920 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
2b930 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
2b940 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
2b950 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
2b960 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
2b970 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b980 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
2b990 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
2b9a0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
2b9b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
2b9c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2b9d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2b9e0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
2b9f0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
2ba00 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
2ba10 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
2ba20 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
2ba30 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
2ba40 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
2ba50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2ba60 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
2ba70 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
2ba80 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
2ba90 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
2baa0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
2bab0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
2bac0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
2bad0 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
2bae0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2baf0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2bb00 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
2bb10 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58  ager?PGHDR_TO_EX
2bb20 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
2bb30 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
2bb40 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
2bb50 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
2bb60 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
2bb70 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
2bb80 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
2bb90 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
2bba0 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
2bbb0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
2bbc0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
2bbd0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
2bbe0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
2bbf0 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
2bc00 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
2bc10 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
2bc20 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
2bc30 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
2bc40 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
2bc50 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
2bc60 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2bc70 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
2bc80 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2bc90 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
2bca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
2bcb0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
2bcc0 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
2bcd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2bce0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
2bcf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2bd00 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
2bd10 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
2bd20 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
2bd30 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
2bd40 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
2bd50 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2bd60 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
2bd70 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
2bd80 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2bd90 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2bda0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2bdb0 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
2bdc0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2bdd0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2bde0 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
2bdf0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2be00 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
2be10 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
2be20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
2be30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
2be40 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
2be50 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
2be60 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
2be70 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
2be80 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
2be90 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
2bea0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
2beb0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
2bec0 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
2bed0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2bee0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
2bef0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
2bf00 54 45 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  TE or .** PAGER_
2bf10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2bf20 49 53 54 2e 20 49 66 20 74 68 65 20 70 61 72 61  IST. If the para
2bf30 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
2bf40 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
2bf50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
2bf60 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
2bf70 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
2bf80 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
2bf90 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
2bfa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bfb0 45 5f 44 45 4c 45 54 45 20 6f 72 0a 2a 2a 20 50  E_DELETE or.** P
2bfc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bfd0 5f 50 45 52 53 49 53 54 2c 20 69 6e 64 69 63 61  _PERSIST, indica
2bfe0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
2bff0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
2c000 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d  ed).** journal-m
2c010 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
2c020 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
2c030 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
2c040 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
2c050 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2c060 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2c070 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
2c080 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
2c090 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c0a0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
2c0b0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2c0c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2c0d0 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
2c0e0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2c0f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c100 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  FF );.  assert( 
2c110 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2c120 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
2c130 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
2c140 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3e  RNALMODE_DELETE>
2c150 3d 30 20 26 26 20 50 41 47 45 52 5f 4a 4f 55 52  =0 && PAGER_JOUR
2c160 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3e  NALMODE_PERSIST>
2c170 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
2c180 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
2c190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2c1a0 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  = eMode;.  }.  r
2c1b0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
2c1c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
2c1d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
2c1e0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
2c1f0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
2c200 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2c210 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  s..*/.i64 sqlite
2c220 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
2c230 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
2c240 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
2c250 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
2c260 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
2c270 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2c280 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
2c290 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
2c2a0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2c2b0 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  mit;.}..#endif /
2c2c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
2c2d0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.