/ Hex Artifact Content
Login

Artifact 008ec5a602d2e8c2f46fff64468fffd6537ed938:


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 33  : pager.c,v 1.43
0350: 31 20 32 30 30 38 2f 30 34 2f 31 39 20 32 30 3a  1 2008/04/19 20:
0360: 35 33 3a 32 36 20 64 72 68 20 45 78 70 20 24 0a  53:26 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4000: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4010: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4020: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4030: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33  -counter */.  u3
4040: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4060: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4070: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4080: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
40a0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
40b0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
40c0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
40f0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
4100: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
4110: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4120: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
4130: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
4140: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
4150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4160: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
4170: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
4180: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
4190: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41c0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
41d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
41e0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
41f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4200: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
4210: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
4220: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
4230: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
4260: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
4270: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
4280: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
4290: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
42a0: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
42b0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
42c0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
42d0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
42e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
4300: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
4310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4320: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
4330: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
4340: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
4350: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
4360: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4370: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
4380: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
4390: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
43a0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
43b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
43d0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
43e0: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
43f0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4400: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
4410: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4430: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
4440: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
4450: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4460: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4480: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
4490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44a0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
44b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
44c0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
44d0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
44e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
44f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
4520: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
4530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4540: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
4550: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
4560: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
4570: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
4580: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
4590: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a  /.  char *zStmtJ
45a0: 72 6e 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  rnl;            
45b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
45c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
45d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
45e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
45f0: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4600: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4610: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4620: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4630: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4640: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4650: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
4660: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4670: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
4680: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4690: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
46a0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
46b0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
46c0: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
46d0: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
46e0: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
46f0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
4700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4710: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4720: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4730: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4750: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4760: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4770: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
4780: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
4790: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
47a0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
47b0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
47c0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
47d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
47e0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
47f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4830: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4840: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4850: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4870: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
4880: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
4890: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
48a0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
48c0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
48d0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
48e0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
48f0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4900: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
4910: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4920: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4930: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4940: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4950: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
4960: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
4970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4980: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
4990: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
49a0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
49b0: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
49c0: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
49d0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
49e0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
49f0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
4a00: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
4a10: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a20: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a40: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4a60: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4a70: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4a80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a90: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4aa0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4ab0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4ac0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4ad0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4ae0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4af0: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4b00: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4b10: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b30: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b40: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b50: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b70: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4b80: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4b90: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bb0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4bc0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4bd0: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4be0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4bf0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4c00: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c20: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c30: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c40: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c50: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4c70: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4c80: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d  */.  int iInUseM
4ca0: 4d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M;              
4cb0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4cc0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4cd0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73  M */.  int iInUs
4ce0: 65 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20  eDB;            
4cf0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d00: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4d10: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d20: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d30: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d40: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4d60: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4d70: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4d80: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4d90: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4da0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4db0: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4dc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4dd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4de0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4df0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4e00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4e10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4e20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4e30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4e40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4e50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4e60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4e70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4e80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4e90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4ea0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4eb0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4ec0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4ed0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4ee0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4ef0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4f00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4f10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4f20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4f30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4f50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4f60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4f70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69   to journal */.i
4f80: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f90: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20  _pgfree_count = 
4fa0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4fb0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66  of cache pages f
4fc0: 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65  reed */.# define
4fd0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
4fe0: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
4ff0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
5000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
5020: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
5030: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f  the head of a do
5040: 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  uble-linked list
5050: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72  .** of all pager
5060: 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69  s that are eligi
5070: 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65  ble for page ste
5080: 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  aling by the.** 
5090: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
50a0: 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61  memory() interfa
50b0: 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74  ce.  Access to t
50c0: 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70  his list is.** p
50d0: 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20  rotected by the 
50e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
50f0: 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a  TIC_MEM2 mutex..
5100: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5110: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5120: 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63  ANAGEMENT.static
5130: 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50   Pager *sqlite3P
5140: 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74  agerList = 0;.st
5150: 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73  atic PagerLruLis
5160: 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  t sqlite3LruPage
5170: 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  List = {0, 0, 0}
5180: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
5190: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
51a0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
51b0: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
51c0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
51d0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
51e0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
51f0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
5200: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
5210: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
5220: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
5230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
5240: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
5250: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
5260: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
5270: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
5280: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
5290: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
52a0: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
52b0: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
52c0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
52d0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
52e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
52f0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
5300: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
5310: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
5320: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
5330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
5340: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
5350: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
5360: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
5370: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
5380: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
5390: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
53a0: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
53b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
53c0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
53d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
53e0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
53f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
5400: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
5410: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
5420: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
5430: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
5440: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
5450: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
5460: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
5470: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
5480: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
5490: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
54a0: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
54b0: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
54c0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
54d0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
54e0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
54f0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
5500: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
5510: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
5520: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
5530: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
5540: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
5550: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
5560: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
5570: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5580: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
5590: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
55a0: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
55b0: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
55c0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
55d0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
55e0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
55f0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
5600: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
5610: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
5620: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
5630: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
5640: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
5650: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
5660: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
5670: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
5680: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
5690: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
56a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
56b0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
56c0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
56d0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
56e0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
56f0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
5700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
5710: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
5720: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
5730: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
5740: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
5750: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
5760: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
5770: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
5780: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
5790: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
57a0: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
57b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
57c0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
57d0: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
57e0: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
57f0: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
5800: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
5810: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
5820: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
5830: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
5840: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
5850: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
5860: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
5870: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
5880: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5890: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
58a0: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
58b0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
58c0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
58d0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
58e0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
58f0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
5900: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
5910: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
5920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5930: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
5940: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
5950: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
5960: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
5970: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
5980: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
5990: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
59a0: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
59b0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
59c0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
59d0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
59e0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
59f0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
5a00: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
5a10: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
5a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
5a30: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
5a40: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5a50: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
5a60: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
5a70: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
5a80: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
5a90: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
5aa0: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
5ab0: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
5ac0: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
5ad0: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5ae0: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
5af0: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
5b00: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
5b10: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
5b20: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
5b30: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
5b40: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
5b50: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
5b60: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
5b70: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
5b80: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47  /./* #define PAG
5b90: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50  ER_MJ_PGNO(x) (P
5ba0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5bb0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a  ->pageSize)) */.
5bc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5bd0: 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49  _PGNO(x) ((PENDI
5be0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5bf0: 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a  geSize))+1)../*.
5c00: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
5c10: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
5c20: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
5c30: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5c40: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
5c50: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
5c60: 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64  pagerEnter() and
5c70: 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f   pagerLeave() ro
5c80: 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61  utines acquire a
5c90: 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20  nd release.** a 
5ca0: 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61  mutex on each pa
5cb0: 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20  ger.  The mutex 
5cc0: 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a  is recursive..**
5cd0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70  .** This is a sp
5ce0: 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  ecial-purpose mu
5cf0: 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72  tex.  It only pr
5d00: 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78  ovides mutual ex
5d10: 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  clusion.** betwe
5d20: 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64  en the Btree and
5d30: 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61   the Memory Mana
5d40: 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72  gement sqlite3_r
5d50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a  elease_memory().
5d60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74  ** function.  It
5d70: 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e   does not preven
5d80: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5d90: 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20  two Btrees from 
5da0: 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65  accessing.** the
5db0: 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74   same pager at t
5dc0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f  he same time.  O
5dd0: 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72  ther general-pur
5de0: 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a  pose mutexes in.
5df0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
5e00: 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63  er handle that c
5e10: 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  hore..*/.#ifdef 
5e20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
5e30: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
5e40: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5e50: 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a  gerEnter(Pager *
5e60: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
5e70: 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  eDB++;.    if( p
5e80: 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d  ->iInUseMM && p-
5e90: 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a  >iInUseDB==1 ){.
5ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5eb0: 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20  tex *mutex;.    
5ec0: 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
5ed0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
5ee0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5ef0: 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70  C_MEM2);.      p
5f00: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
5f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f20: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
5f30: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73  ;.      p->iInUs
5f40: 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eDB = 1;.      s
5f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5f60: 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ve(mutex);.    }
5f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f80: 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20  iInUseMM==0 );. 
5f90: 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
5fa0: 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65   pagerLeave(Page
5fb0: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5fc0: 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73  nUseDB--;.    as
5fd0: 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44  sert( p->iInUseD
5fe0: 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  B>=0 );.  }.#els
5ff0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
6000: 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e  Enter(X).# defin
6010: 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a  e pagerLeave(X).
6020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
6030: 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  d page pPg to th
6040: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e  e end of the lin
6050: 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64  ked list managed
6060: 20 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a   by structure.**
6070: 20 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f   pList (pPg beco
6080: 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74  mes the last ent
6090: 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d  ry in the list -
60a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
60b0: 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72  ly .** used). Ar
60c0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
60d0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
60e0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
60f0: 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20   pPg->gfree,.** 
6100: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
6110: 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e  ther pPg is bein
6120: 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  g added to the p
6130: 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72  ager-specific or
6140: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c  .** global LRU l
6150: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
6160: 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65  oid listAdd(Page
6170: 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c  rLruList *pList,
6180: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
6190: 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67  Link, PgHdr *pPg
61a0: 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  ){.  pLink->pNex
61b0: 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e  t = 0;.  pLink->
61c0: 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70  pPrev = pList->p
61d0: 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Last;..#ifdef SQ
61e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
61f0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6200: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6210: 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e  Pg->free || pLin
6220: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b  k==&pPg->gfree);
6230: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
6240: 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20  =&pPg->gfree || 
6250: 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c  pList!=&sqlite3L
6260: 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e  ruPageList);.#en
6270: 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  dif..  if( pList
6280: 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ->pLast ){.    i
6290: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
62a0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
62b0: 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72  *)pPg;.    Pager
62c0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69  LruLink *pLastLi
62d0: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
62e0: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
62f0: 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66  ist->pLast)[iOff
6300: 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e  ]);.    pLastLin
6310: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a  k->pNext = pPg;.
6320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6330: 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72  ert(!pList->pFir
6340: 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  st);.    pList->
6350: 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
6360: 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73  }..  pList->pLas
6370: 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21  t = pPg;.  if( !
6380: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6390: 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64  ced && pPg->need
63a0: 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Sync==0 ){.    p
63b0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
63c0: 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ed = pPg;.  }.}.
63d0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50  ./*.** Remove pP
63e0: 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  g from the list 
63f0: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73  managed by the s
6400: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
6410: 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a   to by pList..**
6420: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69  .** Argument pLi
6430: 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20  nk should point 
6440: 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66  to either pPg->f
6450: 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65  ree or pPg->gfre
6460: 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a  e, depending .**
6470: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
6480: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
6490: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
64a0: 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c  ific or global L
64b0: 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  RU list..*/.stat
64c0: 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f  ic void listRemo
64d0: 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ve(PagerLruList 
64e0: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
64f0: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6500: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
6510: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6520: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6530: 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
6540: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
6550: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73  _MANAGEMENT.  as
6560: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6570: 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d  ->free || pLink=
6580: 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20  =&pPg->gfree);. 
6590: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
65a0: 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c  pPg->gfree || pL
65b0: 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75  ist!=&sqlite3Lru
65c0: 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69  PageList);.#endi
65d0: 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c  f..  if( pPg==pL
65e0: 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20  ist->pFirst ){. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6600: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
6610: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
6620: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a  pList->pLast ){.
6630: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74      pList->pLast
6640: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b   = pLink->pPrev;
6650: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b  .  }.  if( pLink
6660: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50  ->pPrev ){.    P
6670: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72  agerLruLink *pPr
6680: 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  evLink = (PagerL
6690: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
66a0: 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b  *)pLink->pPrev)[
66b0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65  iOff]);.    pPre
66c0: 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  vLink->pNext = p
66d0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Link->pNext;.  }
66e0: 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e  .  if( pLink->pN
66f0: 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ext ){.    Pager
6700: 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69  LruLink *pNextLi
6710: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
6720: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
6730: 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66  ink->pNext)[iOff
6740: 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e  ]);.    pNextLin
6750: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b  k->pPrev = pLink
6760: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
6770: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6780: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
6790: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c     PgHdr *p = pL
67a0: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ink->pNext;.    
67b0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
67c0: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
67d0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
67e0: 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  L = (PagerLruLin
67f0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b  k *)(&((u8 *)p)[
6800: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20  iOff]);.      p 
6810: 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pL->pNext;.   
6820: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46   }.    pList->pF
6830: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
6840: 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e    }..  pLink->pN
6850: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ext = pLink->pPr
6860: 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ev = 0;.}../* .*
6870: 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74  * Add page pPg t
6880: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  o the list of fr
6890: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
68a0: 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d   pager. If .** m
68b0: 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
68c0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73   is enabled, als
68d0: 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  o add the page t
68e0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a  o the global .**
68f0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6900: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ges..*/.static v
6910: 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50  oid lruListAdd(P
6920: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69  gHdr *pPg){.  li
6930: 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67  stAdd(&pPg->pPag
6940: 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66  er->lru, &pPg->f
6950: 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65  ree, pPg);.#ifde
6960: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6970: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
6980: 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50  T.  if( !pPg->pP
6990: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
69a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
69b0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
69c0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
69d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
69e0: 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64  RU));.    listAd
69f0: 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  d(&sqlite3LruPag
6a00: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6a10: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6a20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6a30: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6a40: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6a50: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6a60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6a70: 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67  * .** Remove pag
6a80: 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c  e pPg from the l
6a90: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
6aa0: 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69  s for the associ
6ab0: 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49  ated pager..** I
6ac0: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6ad0: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6ae0: 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20  also remove pPg 
6af0: 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20  from the global 
6b00: 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20  list.** of free 
6b10: 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
6b20: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d   void lruListRem
6b30: 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ove(PgHdr *pPg){
6b40: 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70  .  listRemove(&p
6b50: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c  Pg->pPager->lru,
6b60: 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67   &pPg->free, pPg
6b70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6b80: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
6b90: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
6ba0: 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65  !pPg->pPager->me
6bb0: 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
6bc0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6be0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6bf0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6c00: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71    listRemove(&sq
6c10: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6c20: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6c30: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
6c40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6c50: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
6c60: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6c70: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
6c80: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
6c90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ca0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66  s called just af
6cb0: 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ter the needSync
6cc0: 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63   flag has been c
6cd0: 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  leared.** from a
6ce0: 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64  ll pages managed
6cf0: 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61   by pPager (usua
6d00: 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  lly because the 
6d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
6d20: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79  has just been sy
6d30: 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65  nced). It update
6d40: 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72  s the pPager->lr
6d50: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76  u.pFirstSynced v
6d60: 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20  ariable.** and, 
6d70: 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
6d80: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6d90: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50   the sqlite3LruP
6da0: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6db0: 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65  nced.** variable
6dc0: 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
6dd0: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74   void lruListSet
6de0: 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65  FirstSynced(Page
6df0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
6e00: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6e10: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
6e20: 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66  >lru.pFirst;.#if
6e30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6e40: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6e50: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65  ENT.  if( !pPage
6e60: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6e70: 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71  PgHdr *p;.    sq
6e80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6e90: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6ea0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6eb0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6ec0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
6ed0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6ee0: 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65  irst; p && p->ne
6ef0: 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72  edSync; p=p->gfr
6f00: 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61  ee.pNext);.    a
6f10: 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d  ssert(p==pPager-
6f20: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6f30: 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c  d || p==sqlite3L
6f40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6f50: 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71  tSynced);.    sq
6f60: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6f70: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6f80: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  p;.    sqlite3_m
6f90: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6fa0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6fb0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6fc0: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65  IC_LRU));.  }.#e
6fd0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
6fe0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67  turn true if pag
6ff0: 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61  e *pPg has alrea
7000: 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
7010: 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
7020: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20  .** journal (or 
7030: 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68  statement snapsh
7040: 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ot has been crea
7050: 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20  ted, if *pPg is 
7060: 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e  part.** of an in
7070: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
7080: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
7090: 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74   pageInStatement
70a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
70b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
70c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
70d0: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
70e0: 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
70f0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
7100: 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c  )->inStmt;.  }el
7110: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  se{.    return s
7120: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
7130: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
7140: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
7150: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7160: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
7170: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
7180: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
7190: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
71a0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
71b0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
71c0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
71d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
71e0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
71f0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
7200: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
7210: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66  (N-1))==0 );.#if
7220: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  def SQLITE_MALLO
7230: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69  C_SOFT_LIMIT.  i
7240: 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73  f( N*sizeof(aHas
7250: 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c  h[0])>SQLITE_MAL
7260: 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29  LOC_SOFT_LIMIT )
7270: 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45  {.    N = SQLITE
7280: 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d  _MALLOC_SOFT_LIM
7290: 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b  IT/sizeof(aHash[
72a0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  0]);.  }.  if( N
72b0: 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  ==pPager->nHash 
72c0: 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66  ) return;.#endif
72d0: 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
72e0: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
72f0: 46 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49  FaultBenign(SQLI
7300: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
7310: 5f 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72 2d  _MALLOC, pPager-
7320: 3e 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61 48  >aHash!=0);.  aH
7330: 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ash = sqlite3Mal
7340: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
7350: 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20  aHash[0])*N );. 
7360: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e   sqlite3FaultBen
7370: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
7380: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c  INJECTOR_MALLOC,
7390: 20 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   0);.  pagerEnte
73a0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
73b0: 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20   aHash==0 ){.   
73c0: 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72   /* Failure to r
73d0: 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20  ehash is not an 
73e0: 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e  error.  It is on
73f0: 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ly a performance
7400: 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74   hit. */.    ret
7410: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
7420: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
7430: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
7440: 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70  ->nHash = N;.  p
7450: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61  Pager->aHash = a
7460: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Hash;.  for(pPg=
7470: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
7480: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
7490: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68  tAll){.    int h
74a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
74b0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gno==0 ){.      
74c0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
74d0: 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
74e0: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
74f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
7500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20  ;.    }.    h = 
7510: 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31  pPg->pgno & (N-1
7520: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7530: 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d  tHash = aHash[h]
7540: 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b  ;.    if( aHash[
7550: 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73  h] ){.      aHas
7560: 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
7570: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7580: 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b   aHash[h] = pPg;
7590: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
75a0: 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ash = 0;.  }.}..
75b0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
75c0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
75d0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
75e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
75f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
7600: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
7610: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
7620: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
7630: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
7640: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
7650: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
7660: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
7670: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
7680: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
7690: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
76a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
76b0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
76c0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
76d0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
76e0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
76f0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
7700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
7710: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
7720: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
7730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
7750: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
7760: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
7770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7780: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7790: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
77a0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
77b0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
77c0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
77d0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
77e0: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
77f0: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f  yte((u8*)A,B)../
7800: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
7810: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
7820: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
7830: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
7840: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
7850: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
7860: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7870: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7880: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
7890: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
78a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
78b0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
78c0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
78d0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
78e0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
78f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
7900: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
7910: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
7920: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
7930: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
7940: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
7950: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
7960: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
7970: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
7980: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
7990: 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  !pFd->pMethods )
79a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
79b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
79c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
79d0: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
79f0: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
7a00: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
7a10: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
7a20: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
7a30: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
7a40: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
7a50: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
7a60: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
7a70: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
7a80: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
7a90: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
7aa0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
7ab0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
7ac0: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
7ad0: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
7ae0: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
7af0: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
7b00: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b10: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
7b20: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
7b30: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
7b40: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
7b50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
7b60: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
7b70: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
7b80: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
7b90: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
7ba0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
7bb0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
7bc0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7bd0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
7be0: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
7bf0: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
7c00: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
7c10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7c20: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
7c30: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
7c40: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
7c50: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7c60: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
7c70: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
7c80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
7c90: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
7ca0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
7cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
7cc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ;        /* Page
7cd0: 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74   size */.  sqlit
7ce0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
7cf0: 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28  ager->fd;..  if(
7d00: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
7d10: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
7d20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
7d30: 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20  eristics(fd);.  
7d40: 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69    nSector = sqli
7d50: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
7d60: 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d  fd);.    nPage =
7d70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7d80: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
7d90: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
7da0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
7db0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
7dc0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7dd0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
7de0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
7df0: 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53  ethods || (dc&(S
7e00: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e10: 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26  IC|(nPage>>8))&&
7e20: 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20  nSector<=nPage) 
7e30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f  ){.    return JO
7e40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7e50: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
7e60: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
7e70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7e80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
7e90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7ea0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ld be called whe
7eb0: 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  n an error occur
7ec0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
7ed0: 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20  er.** code. The 
7ee0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
7ef0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7f00: 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
7f10: 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  re, the.** secon
7f20: 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  d the error-code
7f30: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
7f40: 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
7f50: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a   API function. .
7f60: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
7f70: 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
7f80: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
7f90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
7fa0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
7fb0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
7fc0: 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
7fd0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
7fe0: 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
7ff0: 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
8000: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
8010: 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
8020: 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f  e persisten erro
8030: 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a  r is cleared,.**
8040: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
8050: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
8060: 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
8070: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
8080: 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63  same .** error c
8090: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72  ode..**.** A per
80a0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e  sistent error in
80b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
80c0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
80d0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
80e0: 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
80f0: 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
8100: 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
8110: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
8120: 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
8130: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8140: 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
8150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
8160: 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
8170: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
8180: 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68  rror occured, th
8190: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
81a0: 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
81b0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
81c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
81d0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
81e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
81f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8200: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
8210: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
8220: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
8230: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
8240: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
8250: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
8260: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
8270: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8280: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
8290: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
82a0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
82b0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
82c0: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
82d0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
82e0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
82f0: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
8310: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
8320: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
8330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8340: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
8350: 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
8360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
8370: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8380: 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64  already unlocked
8390: 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c  , call pager_unl
83a0: 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20  ock() now to.   
83b0: 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20     ** clear the 
83c0: 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
83d0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
83e0: 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a  pager-cache is .
83f0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74        ** complet
8400: 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20  ely empty..     
8410: 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
8420: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
8430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8440: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8450: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
8460: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
8470: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
8480: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8490: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
84a0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
84b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
84c0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
84d0: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
84e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
84f0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
8500: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
8510: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
8520: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
8530: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
8540: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
8550: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
8560: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
8570: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
8580: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
8590: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
85a0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
85b0: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
85c0: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
85d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
85e0: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
85f0: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
8600: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
8610: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
8620: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
8630: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
8640: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8650: 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67            (unsig
8660: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
8670: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29  _TO_DATA(pPage))
8680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
8690: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
86a0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
86b0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
86c0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
86d0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
86e0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
86f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
8700: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
8710: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
8720: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8730: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
8740: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
8750: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
8760: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
8770: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
8780: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
8790: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
87a0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
87b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
87c0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
87d0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
87e0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
87f0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d  er->errCode || M
8800: 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72  EMDB || pPg->dir
8810: 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67  ty || .      pPg
8820: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
8830: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
8840: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
8850: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
8860: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
8870: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
8880: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
8890: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
88a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
88b0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
88c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
88d0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
88e0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
88f0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
8900: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8910: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8920: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
8930: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
8940: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
8950: 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  plied by the cal
8960: 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  ler. .**.** zMas
8970: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
8980: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
8990: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
89a0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
89b0: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
89c0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
89d0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
89e0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
89f0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
8a00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
8a10: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
8a20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
8a30: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
8a40: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
8a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8a60: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
8a70: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
8a80: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
8a90: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
8aa0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
8ab0: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
8ac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
8ad0: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
8ae0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
8af0: 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20  ** If no master 
8b00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8b10: 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61  e is present zMa
8b20: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
8b30: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
8b40: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
8b50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8b60: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
8b70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
8b80: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
8b90: 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  r, int nMaster){
8ba0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
8bb0: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
8bc0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
8bd0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
8be0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
8bf0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
8c00: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8c10: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
8c20: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
8c30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8c40: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
8c50: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
8c60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
8c70: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
8c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
8c90: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
8ca0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
8cb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8cc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8cd0: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
8ce0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
8d00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d10: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
8d20: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
8d30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8d40: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8d50: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d60: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
8d70: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
8d80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8d90: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
8db0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
8dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8dd0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
8de0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
8df0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
8e00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8e10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8e20: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
8e30: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
8e40: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
8e50: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
8e60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8e70: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
8e80: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
8e90: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
8ea0: 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[i];.   }.  if(
8eb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
8ec0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
8ed0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
8ee0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
8ef0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
8f00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
8f10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
8f20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
8f30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
8f40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
8f50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
8f60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
8f70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
8f80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
8f90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
8fa0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
8fb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
8fc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
8fd0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
8fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
9000: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
9010: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
9020: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9030: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
9040: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9050: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
9060: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
9070: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
9080: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
9090: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
90a0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
90b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
90c0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
90d0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
90e0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
90f0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9120: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
9130: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
9140: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
9150: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9160: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
9170: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
9180: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
91a0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
91b0: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
91c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
91d0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
91e0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
91f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9200: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
9210: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
9220: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
9230: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
9240: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9250: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
9260: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
9270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9280: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
9290: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
92a0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
92b0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
92c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
92d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
92e0: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
92f0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
9300: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
9310: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
9320: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
9330: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
9340: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
9350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9360: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
9370: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
9380: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9390: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
93a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
93b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
93c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
93d0: 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20 20  zeroHdr[28];..  
93e0: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
93f0: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
9400: 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  )).  rc = sqlite
9410: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9420: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
9430: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
9440: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
9450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
9460: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9470: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
9480: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9490: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
94a0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
94b0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
94c0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94e0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
94f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
9500: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
9510: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
9520: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
9530: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
9540: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
9550: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
9560: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
9570: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
9580: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
9590: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
95a0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
95b0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
95c0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
95d0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
95e0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
95f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
9600: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
9610: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
9620: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
9630: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
9640: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
9650: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
9660: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
9670: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
9680: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
9690: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
96a0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
96b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
96c0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
96d0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68  r *pPager){.  ch
96e0: 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  ar zHeader[sizeo
96f0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9700: 2b 32 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  +20];.  int rc;.
9710: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9720: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
9730: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
9740: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9750: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d  >journalOff;.  }
9760: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
9770: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  dr(pPager);.  pP
9780: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9790: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
97a0: 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79  alOff;..  memcpy
97b0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
97c0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
97d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
97e0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
97f0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
9800: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
9810: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
9820: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
9830: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
9840: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
9850: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
9860: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
9870: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
9880: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
9890: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
98a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
98b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
98c0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
98d0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
98e0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
98f0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
9900: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
9910: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
9920: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
9930: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
9940: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
9950: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
9960: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
9970: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
9980: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
9990: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
99a0: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
99b0: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
99c0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
99d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
99e0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
99f0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
9a00: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
9a10: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
9a20: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
9a30: 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  re occured whils
9a40: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
9a50: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
9a60: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
9a70: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
9a80: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
9a90: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
9aa0: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
9ab0: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
9ac0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
9ad0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
9ae0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
9af0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
9b00: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
9b10: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
9b20: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
9b30: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
9b40: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
9b50: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
9b60: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
9b70: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
9b80: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
9b90: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
9ba0: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
9bb0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9bc0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9bd0: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
9be0: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
9bf0: 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28  ->noSync);.  if(
9c00: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
9c10: 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  ) .   || (sqlite
9c20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
9c30: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
9c40: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
9c50: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
9c60: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
9c70: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9c80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9c90: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
9ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
9cb0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9cc0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9cd0: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
9ce0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
9cf0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
9d00: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
9d10: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
9d20: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
9d30: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
9d40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9d50: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
9d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
9d80: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
9d90: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
9da0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
9db0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
9dc0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9dd0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9de0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
9df0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
9e00: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
9e10: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
9e20: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
9e30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9e40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9e50: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
9e60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
9e70: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9e80: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
9e90: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
9ea0: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
9eb0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9ec0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9ed0: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
9ee0: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 49  geSize);.  }.  I
9ef0: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9f00: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9f10: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9f20: 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28  rnalHdr, sizeof(
9f30: 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20  zHeader))).  rc 
9f40: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9f50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
9f60: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
9f70: 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a  eader),pPager->j
9f80: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50  ournalOff);.  pP
9f90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9fa0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
9fb0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
9fc0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9fd0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
9fe0: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
9ff0: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
a000: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
a010: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
a020: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
a030: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
a040: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
a050: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a060: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41     IOTRACE(("JTA
a070: 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  IL %p %lld\n", p
a080: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
a090: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20  ournalOff-1)).  
a0a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a0b0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
a0c0: 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50  d, "\000", 1, pP
a0d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a0e0: 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  -1);.  }.  retur
a0f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
a100: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a110: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
a120: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
a130: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
a140: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
a150: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a160: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
a170: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a180: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
a190: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
a1a0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
a1b0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
a1c0: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
a1d0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
a1e0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
a1f0: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
a200: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
a210: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
a220: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
a230: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
a240: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
a250: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
a260: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
a270: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
a280: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a290: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
a2a0: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
a2b0: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
a2c0: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
a2d0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
a2e0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
a2f0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
a300: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
a310: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
a320: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
a330: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
a340: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
a350: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
a360: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
a370: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
a380: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
a390: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
a3a0: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
a3b0: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
a3c0: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
a3d0: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
a3e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a3f0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
a400: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
a410: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
a420: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
a430: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
a440: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
a450: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
a460: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
a470: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
a480: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
a490: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
a4a0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
a4b0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
a4c0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
a4d0: 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20  nt iPageSize;.. 
a4e0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
a4f0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
a500: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a510: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
a520: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
a530: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
a540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a550: 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20  ;.  }.  jrnlOff 
a560: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
a570: 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71  lOff;..  rc = sq
a580: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
a590: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
a5a0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
a5b0: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28   jrnlOff);.  if(
a5c0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a5d0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69  .  jrnlOff += si
a5e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20  zeof(aMagic);.. 
a5f0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
a600: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
a610: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
a620: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
a630: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a640: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
a650: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a660: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e  jfd, jrnlOff, pN
a670: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
a680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
a690: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a6a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a6b0: 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e  Off+4, &pPager->
a6c0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66  cksumInit);.  if
a6d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a6e0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a6f0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a700: 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62  , jrnlOff+8, pDb
a710: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
a720: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a730: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a750: 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29  lOff+16, (u32 *)
a760: 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  &iPageSize);.  i
a770: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a780: 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a   .   && iPageSiz
a790: 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50  e>=512 .   && iP
a7a0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
a7b0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
a7c0: 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65    && ((iPageSize
a7d0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d  -1)&iPageSize)==
a7e0: 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20  0 .  ){.    u16 
a7f0: 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67 65  pagesize = iPage
a800: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
a810: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a820: 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
a830: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  pagesize);.  }. 
a840: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a850: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
a860: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
a870: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
a880: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
a890: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
a8a0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a8b0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a8c0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a8d0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
a8e0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
a8f0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
a900: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
a910: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
a920: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
a930: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
a940: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
a950: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
a960: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
a970: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
a980: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
a990: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
a9a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a9b0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a9c0: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
a9d0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
a9e0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
a9f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
aa00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
aa10: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
aa20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
aa30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
aa40: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
aa50: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
aa60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
aa70: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
aa80: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
aa90: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
aaa0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
aab0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
aac0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
aad0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
aae0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
aaf0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
ab00: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
ab10: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
ab20: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
ab30: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
ab40: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
ab50: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
ab60: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
ab70: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
ab80: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
ab90: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
aba0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
abb0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
abc0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
abd0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
abe0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
abf0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
ac00: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
ac10: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
ac20: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
ac30: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
ac40: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
ac50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
ac60: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
ac70: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
ac80: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
ac90: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
aca0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
acb0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
acc0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
acd0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
ace0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
acf0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
ad00: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ad10: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
ad20: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
ad30: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
ad40: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ad50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
ad60: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
ad70: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
ad80: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
ad90: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
ada0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
adb0: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
adc0: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
add0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
ade0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
adf0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
ae00: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
ae10: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
ae20: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
ae30: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
ae40: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
ae50: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
ae60: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
ae70: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
ae80: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
ae90: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
aea0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
aeb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
aec0: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
aed0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
aee0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
aef0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
af00: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
af10: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
af20: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
af30: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
af40: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
af50: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
af60: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
af70: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
af80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
af90: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
afa0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
afb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
afc0: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
afd0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
afe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aff0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
b000: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
b010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
b020: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
b030: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
b040: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
b050: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
b060: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
b070: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
b080: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
b090: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
b0a0: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
b0b0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
b0c0: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
b0d0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
b0e0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
b0f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b100: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b110: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
b120: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
b130: 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  rnlOff);.  pPage
b140: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
b150: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
b160: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b170: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
b180: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
b190: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
b1a0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
b1b0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
b1c0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
b1d0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
b1e0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
b1f0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
b200: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
b210: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
b220: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
b230: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
b240: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
b250: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
b260: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
b270: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
b280: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
b290: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
b2a0: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
b2b0: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
b2c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b2d0: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
b2e0: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
b2f0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
b300: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b310: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b320: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
b330: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
b340: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
b350: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
b360: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
b370: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
b380: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b390: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
b3a0: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
b3b0: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
b3c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
b3d0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
b3e0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
b3f0: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
b400: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
b410: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
b420: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
b430: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
b440: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
b450: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
b460: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
b470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
b480: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
b490: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
b4a0: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
b4b0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
b4c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b4d0: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
b4e0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
b4f0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b500: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b510: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b520: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
b530: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
b540: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
b550: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
b560: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
b570: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
b580: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
b590: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
b5a0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
b5b0: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
b5c0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
b5d0: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
b5e0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
b5f0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
b600: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
b610: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
b620: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
b630: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
b640: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
b650: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
b660: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
b670: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
b680: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
b690: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
b6a0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
b6b0: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
b6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b6d0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b6e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
b6f0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
b700: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b710: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
b720: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
b730: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
b740: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49  Pg=pNext){.    I
b750: 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
b760: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b770: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
b780: 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
b790: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
b7a0: 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70  ee_count);.    p
b7b0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
b7c0: 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73  tAll;.    lruLis
b7d0: 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
b7e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b7f0: 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
b800: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
b810: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b820: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
b830: 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  st==0);.  assert
b840: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
b850: 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20  rstSynced==0);. 
b860: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
b870: 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20  lru.pLast==0);. 
b880: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b890: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
b8a0: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
b8b0: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
b8c0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
b8d0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
b8e0: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
b8f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
b900: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
b910: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
b920: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
b930: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b940: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b950: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
b960: 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
b970: 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61  tly in error sta
b980: 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  te, discard the 
b990: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20  contents of .** 
b9a0: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
b9b0: 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74  set the Pager st
b9c0: 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c  ructure internal
b9d0: 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65   state. If there
b9e0: 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a   is.** an open j
b9f0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65  ournal-file, the
ba00: 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  n the next time 
ba10: 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
ba20: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
ba30: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28  the pager file (
ba40: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
ba50: 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69  ther process), i
ba60: 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65  t will be.** tre
ba70: 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  ated as a hot-jo
ba80: 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
ba90: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
baa0: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
bab0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
bac0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
bad0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bae0: 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
baf0: 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  B ){.      int r
bb00: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
bb10: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
bb20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
bb30: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
bb40: 65 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50  e = rc;.      pP
bb50: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
bb60: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
bb70: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
bb80: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20   pPager))..     
bb90: 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65   /* Always close
bba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bbb0: 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
bbc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
bbd0: 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  k..      ** Othe
bbe0: 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63  rwise, another c
bbf0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
bc00: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
bc10: 74 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a  te might.      *
bc20: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
bc30: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
bc40: 20 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   us..      */.  
bc50: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
bc60: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
bc70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
bc80: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
bc90: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  d);.        pPag
bca0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
bcb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
bcc0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
bcd0: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
bce0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70  rnal);.        p
bcf0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
bd00: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  l = 0;.      }..
bd10: 20 20 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65        /* If Page
bd20: 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
bd30: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
bd40: 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
bd50: 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20  e cannot be.    
bd60: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
bd70: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
bd80: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
bd90: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
bda0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
bdb0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
bdc0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
bdd0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
bde0: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
bdf0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
be00: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
be10: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
be20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67  SQLITE_OK ) pPag
be30: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
be40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
be50: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
be60: 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
be70: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
be80: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
be90: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
bea0: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
beb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
bec0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
bed0: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
bee0: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
bef0: 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >pInStmt = 0;.  
bf00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bf10: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
bf20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
bf30: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
bf40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
bf50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
bf60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
bf70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
bf80: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
bf90: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
bfa0: 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  oopen = 0;.     
bfb0: 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
bfc0: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  bSize = 0;.     
bfd0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
bfe0: 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67  ( !MEMDB || pPag
bff0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
c000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c010: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
c020: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
c030: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
c040: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
c050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
c060: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
c070: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
c080: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
c090: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
c0a0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
c0b0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
c0c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
c0d0: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
c0e0: 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74  tate, .** do not
c0f0: 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c   attempt the rol
c100: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
c110: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
c120: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
c130: 65 72 20 2a 70 29 7b 0a 20 20 2f 2a 20 61 73 73  er *p){.  /* ass
c140: 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50  ert( p->state>=P
c150: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
c160: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d   p->journalOpen=
c170: 3d 30 20 29 3b 20 2a 2f 0a 20 20 69 66 28 20 70  =0 ); */.  if( p
c180: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
c190: 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65  E_OK && p->state
c1a0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
c1b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
c1c0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
c1d0: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
c1e0: 6f 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20 20  ock(p);.#if 0.  
c1f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
c200: 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61  de || !p->journa
c210: 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63  lOpen || (p->exc
c220: 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e  lusiveMode&&!p->
c230: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20  journalOff) );. 
c240: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
c250: 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f  ode || !p->stmtO
c260: 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73  pen || p->exclus
c270: 69 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64 69  iveMode );.#endi
c280: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
c290: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
c2a0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74  ransaction.  A t
c2b0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
c2c0: 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a  ded by either.**
c2d0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
c2e0: 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57  OLLBACK..**.** W
c2f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
c300: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
c310: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
c320: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
c330: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
c340: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
c350: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
c360: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
c370: 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a  ne will release.
c380: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
c390: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
c3a0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
c3b0: 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20  in its place if 
c3c0: 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61  that is.** the a
c3d0: 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67  ppropriate thing
c3e0: 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65   to do.  Release
c3f0: 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69   locks usually i
c400: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a  s appropriate,.*
c410: 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20  * unless we are 
c420: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
c430: 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65  ess mode or unle
c440: 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a  ss this is a .**
c450: 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49   COMMIT AND BEGI
c460: 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e  N or ROLLBACK AN
c470: 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f  D BEGIN operatio
c480: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  n..**.** The jou
c490: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74  rnal file is eit
c4a0: 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74  her deleted or t
c4b0: 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  runcated..**.** 
c4c0: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
c4d0: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
c4e0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
c4f0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
c500: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
c510: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
c520: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
c530: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
c540: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
c550: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
c560: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
c570: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c580: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c590: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
c5a0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
c5b0: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
c5c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
c5d0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
c5e0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
c5f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
c600: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
c610: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
c620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c630: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
c640: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
c650: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
c660: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
c670: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c680: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  veMode ){.    sq
c690: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c6a0: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
c6b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
c6c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
c6d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c6e0: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28  pen ){.    if( (
c6f0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c700: 65 4d 6f 64 65 20 7c 7c 0a 20 20 20 20 20 20 20  eMode ||.       
c710: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c720: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
c730: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
c740: 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 72 63  ) .       && (rc
c750: 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
c760: 72 28 70 50 61 67 65 72 29 29 3d 3d 53 51 4c 49  r(pPager))==SQLI
c770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
c780: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c790: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
c7a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
c7b0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
c7c0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c7d0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c7e0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
c7f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
c810: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c820: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c830: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
c840: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
c850: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
c860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c870: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c880: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c890: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c8a0: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c8b0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
c8c0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
c8d0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
c8e0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
c8f0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
c900: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
c910: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
c920: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
c930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
c940: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
c950: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
c960: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
c970: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
c980: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c990: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
c9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
c9b0: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
c9c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
c9d0: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
c9e0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
c9f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
ca00: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
ca10: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
ca20: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
ca30: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
ca40: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
ca50: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
ca60: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
ca70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
ca80: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
ca90: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
caa0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
cab0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
cac0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cad0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
cae0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
caf0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
cb00: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
cb10: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
cb20: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
cb30: 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69  ;.  lruListSetFi
cb40: 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
cb50: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
cb60: 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74  ize = -1;..  ret
cb70: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
cb80: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
cb90: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
cba0: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
cbb0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
cbc0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
cbd0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
cbe0: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
cbf0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
cc00: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
cc10: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
cc20: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
cc30: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
cc40: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
cc50: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
cc60: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
cc70: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
cc80: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
cc90: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
cca0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
ccb0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
ccc0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
ccd0: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
cce0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
ccf0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
cd00: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
cd10: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
cd20: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
cd30: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
cd40: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
cd50: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
cd60: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
cd70: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
cd80: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
cd90: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
cda0: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
cdb0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
cdc0: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
cdd0: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
cde0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
cdf0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
ce00: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
ce10: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
ce20: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
ce30: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
ce40: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
ce50: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
ce60: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
ce70: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
ce80: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
ce90: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
cea0: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
ceb0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
cec0: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
ced0: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
cee0: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
cef0: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
cf00: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
cf10: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
cf20: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
cf30: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
cf40: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
cf50: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
cf60: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
cf70: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
cf80: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
cf90: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
cfa0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
cfb0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
cfc0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
cfd0: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
cfe0: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
cff0: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
d000: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
d010: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
d020: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d030: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d040: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d050: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d060: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
d070: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
d080: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
d090: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
d0a0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
d0b0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
d0c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d0d0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
d0e0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
d0f0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
d100: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
d110: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
d120: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
d130: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
d140: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
d150: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
d160: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
d170: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
d180: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
d190: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
d1a0: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
d1b0: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
d1c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
d1d0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d1e0: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
d1f0: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71  r *pPager, .  sq
d200: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c  lite3_file *jfd,
d210: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20  .  i64 offset,. 
d220: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b   int useCksum.){
d230: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
d240: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
d250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
d260: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
d270: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
d280: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2a0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
d2b0: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
d2c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
d2d0: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
d2f0: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
d300: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
d310: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  /.  u8 *aData = 
d320: 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
d330: 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65  mpSpace;   /* Te
d340: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
d350: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
d360: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
d370: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
d380: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
d390: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
d3a0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d3b0: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
d3c0: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
d3d0: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
d3e0: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
d3f0: 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72  seCksum ? pPager
d400: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
d410: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
d420: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
d430: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
d440: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
d450: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
d460: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
d470: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
d480: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
d490: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
d4a0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
d4b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d4c0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d4d0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
d4e0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
d4f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
d500: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
d510: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
d520: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
d530: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
d540: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
d550: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
d560: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
d570: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
d580: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
d590: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
d5a0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
d5b0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
d5c0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
d5d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
d5e0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
d5f0: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
d600: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
d610: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
d620: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
d630: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
d640: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
d650: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
d660: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d670: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
d680: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
d690: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
d6a0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
d6b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d6c0: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
d6d0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
d6e0: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
d6f0: 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  t+pPager->pageSi
d700: 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  ze+4, &cksum);. 
d710: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d720: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
d730: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
d740: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
d750: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
d760: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
d770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d780: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
d790: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
d7a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
d7b0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
d7c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d7d0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
d7e0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
d7f0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
d800: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
d810: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
d820: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
d830: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
d840: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
d850: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
d860: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
d870: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
d880: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d890: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
d8a0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
d8b0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
d8c0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
d8d0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
d8e0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
d8f0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
d900: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
d910: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
d920: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
d930: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
d940: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d950: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
d960: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d970: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
d980: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
d990: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
d9a0: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
d9b0: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
d9c0: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
d9d0: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
d9e0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
d9f0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
da00: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
da10: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
da20: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
da30: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
da40: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
da50: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
da60: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
da70: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
da80: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
da90: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
daa0: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
dab0: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
dac0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
dad0: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
dae0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
daf0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
db00: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
db10: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
db20: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
db30: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
db40: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
db50: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
db60: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
db70: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
db80: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
db90: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
dba0: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
dbb0: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
dbc0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
dbd0: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
dbe0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
dbf0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
dc00: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
dc10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
dc20: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
dc30: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
dc40: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
dc50: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
dc60: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
dc70: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
dc80: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
dc90: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
dca0: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
dcb0: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
dcc0: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
dcd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
dce0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
dcf0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
dd00: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
dd10: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
dd20: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
dd30: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
dd40: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
dd50: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
dd60: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
dd70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
dd80: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
dd90: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
dda0: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
ddb0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
ddc0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
ddd0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
dde0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
ddf0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
de00: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
de10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
de20: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
de30: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
de40: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
de50: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
de60: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
de70: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
de80: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
de90: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
dea0: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
deb0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
dec0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
ded0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
dee0: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
def0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
df00: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
df10: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
df20: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
df30: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
df40: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
df50: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
df60: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
df70: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
df80: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
df90: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
dfa0: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
dfb0: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
dfc0: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
dfd0: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
dfe0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
dff0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
e000: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
e010: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
e020: 79 6e 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ync==0).        
e030: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
e040: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
e050: 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
e060: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
e070: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
e080: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
e090: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
e0a0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e0b0: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
e0c0: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
e0d0: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
e0e0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
e0f0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
e100: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
e110: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
e120: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
e130: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
e140: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
e150: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
e160: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
e170: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
e180: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
e190: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
e1a0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
e1b0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
e1c0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
e1d0: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
e1e0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
e1f0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
e200: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
e210: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
e220: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
e230: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
e240: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
e250: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
e260: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
e270: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
e280: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
e290: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
e2a0: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
e2b0: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
e2c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e2d0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e2e0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
e2f0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
e300: 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72  iter(pPg, pPager
e310: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
e320: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
e330: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
e340: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
e350: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
e360: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
e370: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
e380: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
e390: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
e3a0: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
e3b0: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
e3c0: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
e3d0: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
e3e0: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
e3f0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
e400: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
e410: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
e420: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
e430: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
e440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
e450: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
e460: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
e470: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
e480: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
e490: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
e4a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e4b0: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
e4c0: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
e4d0: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
e4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
e4f0: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
e500: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
e510: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
e520: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e530: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
e540: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
e550: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
e560: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
e570: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
e580: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e590: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
e5a0: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
e5b0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
e5c0: 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
e5d0: 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
e5e0: 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
e5f0: 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
e600: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
e610: 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
e620: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  nction..**.**.**
e630: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
e640: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e650: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
e660: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
e670: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
e680: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e690: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
e6a0: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
e6b0: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
e6c0: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
e6d0: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
e6e0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
e6f0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
e700: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
e710: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
e720: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
e730: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
e740: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
e750: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
e760: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
e780: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
e790: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
e7a0: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
e7b0: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
e7c0: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  _open = 0;.  sql
e7d0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
e7e0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er;.  sqlite3_fi
e7f0: 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20  le *pJournal;.  
e800: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
e810: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
e820: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
e830: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
e840: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
e850: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
e860: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
e870: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
e880: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
e890: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e8a0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
e8b0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
e8c0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
e8d0: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
e8e0: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
e8f0: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
e900: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
e910: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
e920: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
e930: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
e940: 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  c(pVfs->szOsFile
e950: 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
e960: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
e970: 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
e980: 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
e990: 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
e9a0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
e9b0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e9c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
e9d0: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
e9e0: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
e9f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
ea00: 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
ea10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ea20: 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
ea30: 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
ea40: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
ea50: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ea60: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
ea70: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
ea80: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
ea90: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
eaa0: 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
eab0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
eac0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ead0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
eae0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
eaf0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
eb00: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
eb10: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
eb20: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
eb30: 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
eb40: 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  tr = pPager->pVf
eb50: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
eb60: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
eb70: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
eb80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
eb90: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
eba0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
ebb0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
ebc0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
ebd0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
ebe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
ebf0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
ec00: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
ec10: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
ec20: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
ec30: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
ec40: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
ec50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
ec60: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
ec70: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
ec80: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
ec90: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
eca0: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
ecb0: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
ecc0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ecd0: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
ece0: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
ecf0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
ed00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ed10: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
ed20: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
ed30: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
ed40: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
ed50: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
ed60: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
ed70: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
ed80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ed90: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
eda0: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
edb0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b  _ACCESS_EXISTS);
edc0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
edd0: 20 26 26 20 72 63 21 3d 31 20 29 7b 0a 20 20 20   && rc!=1 ){.   
ede0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
edf0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
ee00: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
ee10: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ee20: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
ee30: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
ee40: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
ee50: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
ee60: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
ee70: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
ee80: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
ee90: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
eea0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
eeb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
eec0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
eed0: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
eee0: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
eef0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ef00: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ef10: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
ef20: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
ef30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
ef40: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
ef50: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
ef60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ef70: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
ef80: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
ef90: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
efa0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
efb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
efc0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
efd0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
efe0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
eff0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
f000: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
f010: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
f020: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
f030: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f040: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
f050: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f060: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f070: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f080: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
f090: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
f0a0: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
f0b0: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
f0c0: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
f0d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
f0e0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
f0f0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
f100: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
f110: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f120: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
f130: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
f140: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
f150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f160: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
f170: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
f180: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
f190: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f1a0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f1b0: 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
f1c0: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
f1d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
f1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f1f0: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
f200: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
f210: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
f220: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
f230: 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
f240: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
f250: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
f260: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  rc;.}...static v
f270: 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
f280: 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
f290: 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pPager);../*.** 
f2a0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
f2b0: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
f2c0: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
f2d0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
f2e0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41  .** indicated. A
f2f0: 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65  lso truncate the
f300: 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e   cached represen
f310: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
f320: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20  le..**.** Might 
f330: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
f340: 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
f350: 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
f360: 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a  er than nPage..*
f370: 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  * This can happe
f380: 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
f390: 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65  if we are in the
f3a0: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61   middle of a tra
f3b0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  nsaction.** whic
f3c0: 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74  h has extended t
f3d0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64  he file size and
f3e0: 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61   the new pages a
f3f0: 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c  re still all hel
f400: 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74  d.** in cache, t
f410: 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  hen an INSERT or
f420: 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73   UPDATE does a s
f430: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
f440: 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72  k.  Some.** oper
f450: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
f460: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
f470: 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
f480: 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74   you try to.** t
f490: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
f4a0: 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
f4b0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f4c0: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  it currently is,
f4d0: 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68  .** so detect th
f4e0: 69 73 20 63 61 73 65 20 61 6e 64 20 64 6f 20 6e  is case and do n
f4f0: 6f 74 20 64 6f 20 74 68 65 20 74 72 75 6e 63 61  ot do the trunca
f500: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
f510: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
f520: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
f530: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
f540: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f550: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
f560: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
f570: 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67  XCLUSIVE && pPag
f580: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
f590: 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
f5a0: 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
f5b0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
f5c0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
f5d0: 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
f5e0: 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
f5f0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
f600: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
f610: 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
f620: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
f630: 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
f640: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
f650: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
f660: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
f670: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
f680: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f690: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
f6a0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
f6b0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
f6c0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
f6d0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
f6e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
f6f0: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
f700: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
f710: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
f720: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
f730: 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20  at least as big 
f740: 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  as the sector si
f750: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
f760: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
f770: 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69  rSize().  The mi
f780: 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a  nimum sector siz
f790: 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  e is 512..*/.sta
f7a0: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
f7b0: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
f7c0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
f7d0: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
f7e0: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
f7f0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
f800: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f810: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
f820: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
f830: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
f840: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
f850: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f860: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
f870: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
f880: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
f890: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
f8a0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
f8b0: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
f8c0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
f8d0: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f8e0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
f8f0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
f900: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
f910: 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
f920: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
f930: 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
f940: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
f950: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
f960: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
f970: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f980: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
f990: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
f9a0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
f9b0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
f9c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
f9d0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
f9e0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
f9f0: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
fa00: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
fa10: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
fa20: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
fa30: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
fa40: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
fa50: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
fa60: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
fa70: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
fa80: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
fa90: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
faa0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
fab0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
fac0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
fad0: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
fae0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
faf0: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
fb00: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
fb10: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
fb20: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
fb30: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
fb40: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
fb50: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
fb60: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
fb70: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
fb80: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
fb90: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
fba0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
fbb0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
fbc0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
fbd0: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
fbe0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
fbf0: 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
fc00: 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
fc10: 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
fc20: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
fc30: 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
fc40: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
fc50: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
fc60: 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29  ge case..**  (7)
fc70: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
fc80: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
fc90: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
fca0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fcb0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
fcc0: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
fcd0: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
fce0: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
fcf0: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
fd00: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
fd10: 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20  *  (8)  N bytes 
fd20: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
fd30: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
fd40: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
fd50: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
fd60: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
fd70: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
fd80: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
fd90: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
fda0: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
fdb0: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
fdc0: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
fdd0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
fde0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
fdf0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
fe00: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
fe10: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
fe20: 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72  **  (9)  Zero or
fe30: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
fe40: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
fe50: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
fe60: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
fe70: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
fe80: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
fe90: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
fea0: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
feb0: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
fec0: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
fed0: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
fee0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
fef0: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
ff00: 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  8 items above..*
ff10: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
ff20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
ff30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
ff40: 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 9th item..**.*
ff50: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
ff60: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
ff70: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
ff80: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
ff90: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
ffa0: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
ffb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
ffc0: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
ffd0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
ffe0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
fff0: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
10000 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
10010 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
10020 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
10030 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
10040 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
10050 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
10060 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
10070 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
10080 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
10090 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
100a0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
100b0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
100c0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
100d0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
100e0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
100f0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
10100 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
10110 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
10120 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
10130 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
10140 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
10150 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
10160 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
10170 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
10180 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
10190 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
101a0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
101b0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
101c0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
101d0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
101e0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
101f0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
10200 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
10210 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
10220 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
10230 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
10240 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
10250 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
10260 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
10270 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
10280 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
10290 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
102a0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
102b0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
102c0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
102d0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
102e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
102f0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
10300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
10310 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
10320 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
10330 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
10340 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
10350 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
10360 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
10370 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
10380 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
10390 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
103a0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
103b0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
103c0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
103d0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
103e0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
103f0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
10400 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
10410 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
10420 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
10430 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
10440 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
10450 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
10460 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
10470 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
10480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10490 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
104a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
104b0 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
104c0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
104d0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
104e0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
104f0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10500 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
10510 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
10520 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
10530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10540 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
10550 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
10560 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10580 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
10590 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
105a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
105b0 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
105c0 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
105d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
105f0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
10600 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
10610 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 20  .  int res = 0; 
10620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
10630 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
10640 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
10650 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
10660 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
10670 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
10680 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10690 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20  if any */..  /* 
106a0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
106b0 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
106c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
106d0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
106e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
106f0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
10700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10710 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
10720 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
10730 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
10740 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
10750 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10760 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20  K || szJ==0 ){. 
10770 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10780 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
10790 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
107a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
107b0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
107c0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
107d0 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
107e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
107f0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
10800 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
10810 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
10820 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
10830 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
10840 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
10850 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
10860 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
10870 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
10880 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
10890 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
108a0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
108b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
108c0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
108d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
108e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
108f0 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65  TE_OK || (zMaste
10900 72 5b 30 5d 20 0a 20 20 20 26 26 20 28 72 65 73  r[0] .   && (res
10910 3d 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  =sqlite3OsAccess
10920 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10930 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
10940 49 53 54 53 29 29 3d 3d 30 20 29 20 0a 20 20 29  ISTS))==0 ) .  )
10950 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
10960 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  0;.    goto end_
10970 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
10980 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
10990 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
109a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
109b0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  R_NOMEM;.    got
109c0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
109d0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
109e0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
109f0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
10a00 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
10a10 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
10a20 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
10a30 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
10a40 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
10a50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
10a60 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
10a70 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10a80 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
10a90 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
10aa0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
10ab0 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
10ac0 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
10ad0 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
10ae0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
10af0 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
10b00 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
10b10 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
10b20 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
10b30 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
10b40 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
10b50 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
10b60 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
10b70 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
10b80 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
10b90 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
10ba0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
10bb0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
10bc0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
10bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
10be0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10bf0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
10c00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
10c10 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
10c20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10c30 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
10c40 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
10c50 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
10c60 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
10c70 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10c80 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
10c90 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
10ca0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
10cb0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
10cc0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
10cd0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
10ce0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
10cf0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
10d00 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
10d10 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
10d20 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
10d30 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
10d40 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
10d50 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
10d60 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
10d70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10d80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
10d90 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10da0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
10db0 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
10dc0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
10dd0 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
10de0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
10df0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
10e00 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
10e10 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
10e20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
10e30 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
10e40 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
10e50 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
10e60 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
10e70 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
10e80 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
10e90 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
10ea0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
10eb0 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
10ec0 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
10ed0 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
10ee0 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
10ef0 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
10f00 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
10f10 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
10f20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
10f30 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
10f40 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
10f50 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
10f60 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
10f70 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
10f80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
10f90 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
10fa0 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
10fb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
10fc0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10fd0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
10fe0 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
10ff0 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
11000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11010 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
11020 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
11030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11040 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
11050 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
11060 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
11070 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
11080 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11090 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
110a0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
110b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
110c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
110d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
110e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
110f0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
11100 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
11110 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11130 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
11140 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
11150 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
11160 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
11170 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
11180 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
11190 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
111a0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
111b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
111c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
111d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
111e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
111f0 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
11200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11210 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  ff, 1);.      if
11220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11230 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
11240 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
11250 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
11260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
11270 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11280 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
11290 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
112a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
112b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
112c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
112d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
112e0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
112f0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
11300 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
11310 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
11320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11330 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
11340 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
11350 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
11360 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
11370 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
11380 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
11390 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
113a0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
113b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
113c0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
113d0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
113e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
113f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
11400 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a  ter[0] ){.    /*
11410 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
11420 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
11430 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
11440 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
11450 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
11460 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
11470 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
11480 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
11490 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
114a0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
114b0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
114c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
114d0 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
114e0 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
114f0 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
11500 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
11510 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
11520 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
11530 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
11540 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
11550 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
11560 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
11570 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
11580 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
11590 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
115a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
115b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
115c0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
115d0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
115e0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
115f0 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
11600 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
11610 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11620 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
11630 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
11640 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
11650 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
11660 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11670 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
11680 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
11690 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
116a0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
116b0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
116c0 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
116d0 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
116e0 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
116f0 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
11700 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
11710 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
11720 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
11730 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
11740 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
11750 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
11760 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
11770 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
11780 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
11790 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
117a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
117b0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
117c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
117d0 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
117e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
117f0 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
11800 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
11810 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
11820 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11830 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
11840 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
11850 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11860 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11870 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
11880 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
11890 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
118a0 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
118b0 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
118c0 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
118d0 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
118e0 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  journal.  ** pag
118f0 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
11900 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
11910 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68  al-header for th
11920 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
11930 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
11940 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68  s written, or th
11950 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
11960 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
11970 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
11980 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
11990 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
119a0 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
119b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
119c0 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
119d0 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
119e0 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
119f0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
11a00 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
11a10 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
11a20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
11a30 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
11a40 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
11a50 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11a60 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73  >stmtSize);.  as
11a70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11a80 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11a90 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  D );..  /* Figur
11aa0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
11ab0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
11ac0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11ad0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
11ae0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
11af0 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
11b00 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
11b10 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
11b20 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
11b30 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
11b40 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
11b50 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
11b60 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
11b70 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
11b80 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
11b90 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
11ba0 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
11bb0 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
11bc0 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
11bd0 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
11be0 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
11bf0 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
11c00 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
11c10 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
11c20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
11c30 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  c; i++){.    i64
11c40 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70   offset = i*(4+p
11c50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
11c60 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
11c70 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
11c80 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
11c90 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
11ca0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
11cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
11cc0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
11cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11ce0 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11cf0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
11d00 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
11d10 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
11d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
11d30 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
11d40 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
11d50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
11d60 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11d70 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
11d80 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
11d90 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
11da0 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
11db0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
11dc0 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
11dd0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
11de0 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
11df0 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
11e00 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
11e10 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
11e20 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
11e30 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
11e40 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
11e50 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
11e60 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
11e70 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
11e80 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11e90 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50  ction..  */.  pP
11ea0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11eb0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
11ec0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
11ed0 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
11ee0 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
11ef0 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
11f00 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72  journalOff < hdr
11f10 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Off ){.    rc = 
11f20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
11f30 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
11f40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11f50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
11f60 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
11f70 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
11f80 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
11f90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11fa0 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11fb0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
11fc0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11fd0 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
11fe0 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
11ff0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12000 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
12010 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
12020 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
12030 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
12040 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
12050 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
12060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12070 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12080 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12090 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
120a0 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
120b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
120c0 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
120d0 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
120e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
120f0 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
12100 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
12110 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
12120 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
12130 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12140 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
12150 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
12160 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
12170 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
12180 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
12190 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
121a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
121b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
121c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
121d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
121e0 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
121f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
12200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12210 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
12220 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
12230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12240 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
12250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
12260 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
12270 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
12280 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
12290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
122a0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
122b0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
122c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
122d0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
122e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
122f0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
12300 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
12310 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12320 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
12330 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
12340 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
12350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
12360 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
12370 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
12380 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
12390 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
123a0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
123b0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
123c0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
123d0 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
123e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
123f0 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
12400 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
12410 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
12420 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
12430 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
12440 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
12450 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
12460 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
12470 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
12480 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12490 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
124a0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
124b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
124c0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
124d0 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
124e0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
124f0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
12500 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
12510 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
12520 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
12530 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
12540 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12550 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
12560 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
12570 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
12580 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
12590 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
125a0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
125b0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
125c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
125e0 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
125f0 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
12600 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
12610 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12620 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
12630 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12640 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
12650 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
12660 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
12670 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
12680 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12690 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
126a0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
126b0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
126c0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
126d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
126e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
126f0 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
12700 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
12710 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
12720 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
12730 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
12740 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
12760 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
12770 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
12780 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
12790 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
127a0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
127b0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
127c0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
127d0 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
127e0 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
127f0 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
12800 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
12810 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
12820 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
12830 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
12840 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
12850 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
12860 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
12870 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
12880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12890 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
128a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
128b0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
128c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
128d0 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
128e0 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50  ull_fsync){.  pP
128f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
12900 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
12910 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12920 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12930 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
12940 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12950 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
12960 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f 66  _flags = (full_f
12970 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
12980 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
12990 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
129a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
129b0 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
129c0 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
129d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
129e0 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
129f0 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
12a00 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
12a10 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
12a20 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
12a30 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
12a40 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
12a50 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
12a60 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
12a70 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
12a80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
12a90 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
12aa0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
12ab0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
12ac0 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
12ad0 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
12ae0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
12af0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
12b00 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
12b10 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
12b20 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
12b30 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
12b40 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
12b50 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
12b60 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
12b70 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20  mporary.** file 
12b80 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
12b90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
12bb0 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33  ntemp(.  sqlite3
12bc0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 2f  _vfs *pVfs,    /
12bd0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
12be0 6c 65 20 73 79 73 74 65 6d 20 6c 61 79 65 72 20  le system layer 
12bf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
12c00 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
12c10 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
12c20 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
12c30 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
12c40 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
12c50 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 4d 69  of the file.  Mi
12c60 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
12c70 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
12c80 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
12c90 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
12ca0 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
12cb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
12cc0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
12cd0 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
12ce0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
12cf0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
12d00 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
12d10 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
12d20 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
12d30 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
12d40 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
12d50 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
12d60 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
12d70 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
12d80 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
12d90 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
12da0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
12db0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
12dc0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46 69 6c  sOpen(pVfs, zFil
12dd0 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76 66  ename, pFile, vf
12de0 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
12df0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
12e00 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d  _OK || pFile->pM
12e10 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75  ethods );.  retu
12e20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12e30 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
12e40 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
12e50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
12e60 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
12e70 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
12e80 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
12e90 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
12ea0 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
12eb0 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
12ec0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
12ed0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
12ee0 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  rGet() and is on
12ef0 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
12f00 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
12f10 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
12f20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
12f30 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  erUnref()..**.**
12f40 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12f50 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
12f60 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
12f70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
12f80 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
12f90 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
12fa0 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
12fb0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
12fc0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
12fd0 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
12fe0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
12ff0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
13000 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
13010 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
13020 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
13030 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72  ..** It is never
13040 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
13050 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
13060 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
13070 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79   an.** in-memory
13080 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
13090 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
130a0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
130b0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
130c0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
130d0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
130e0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
130f0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
13100 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
13110 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
13120 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13130 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
13140 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
13150 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
13160 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
13170 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
13180 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
13190 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
131a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
131b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131d0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
131e0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
131f0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
13210 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
13220 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
13230 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
13240 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
13250 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
13260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13270 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
13280 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
13290 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
132a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
132b0 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
132c0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
132d0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
132e0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
132f0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
13300 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
13310 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
13320 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
13330 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a  eSize = sqlite3J
13340 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
13350 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c 74  ;.  int nDefault
13360 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Page = SQLITE_DE
13370 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13380 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
13390 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e  me;.  int nPathn
133a0 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  ame;.  char *zSt
133b0 6d 74 4a 72 6e 6c 3b 0a 20 20 69 6e 74 20 6e 53  mtJrnl;.  int nS
133c0 74 6d 74 4a 72 6e 6c 3b 0a 0a 20 20 2f 2a 20 54  tmtJrnl;..  /* T
133d0 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
133e0 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
133f0 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
13400 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
13410 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61  pute the full pa
13420 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74  thname */.  nPat
13430 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
13440 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50  Pathname+1;.  zP
13450 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
13460 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  3_malloc(nPathna
13470 6d 65 2a 32 29 3b 0a 20 20 69 66 28 20 7a 50 61  me*2);.  if( zPa
13480 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
13490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
134a0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
134b0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
134c0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
134d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
134e0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
134f0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
13500 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
13510 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
13520 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
13530 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
13540 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
13550 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20     {.      rc = 
13560 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
13570 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
13580 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
13590 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
135a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
135b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47   rc = sqlite3OsG
135c0 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c  etTempname(pVfs,
135d0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
135e0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  hname);.  }.  if
135f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13610 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13620 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13630 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d   }.  nPathname =
13640 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d   strlen(zPathnam
13650 65 29 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 74 68  e);..  /* Put th
13660 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
13670 6e 61 6c 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  nal in temporary
13680 20 64 69 73 6b 20 73 70 61 63 65 20 73 69 6e 63   disk space sinc
13690 65 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 73  e this is.  ** s
136a0 6f 6d 65 74 69 6d 65 73 20 52 41 4d 20 64 69 73  ometimes RAM dis
136b0 6b 20 6f 72 20 6f 74 68 65 72 20 6f 70 74 69 6d  k or other optim
136c0 69 7a 65 64 20 73 74 6f 72 61 67 65 2e 20 20 55  ized storage.  U
136d0 6e 6c 69 6b 65 6c 79 20 74 68 65 20 6d 61 69 6e  nlikely the main
136e0 0a 20 20 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e  .  ** main journ
136f0 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 73 74 61  al file, the sta
13700 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
13710 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
13720 62 65 20 0a 20 20 2a 2a 20 63 6f 6c 6f 63 61 74  be .  ** colocat
13730 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
13740 62 61 73 65 20 6e 6f 72 20 64 6f 65 73 20 69 74  base nor does it
13750 20 6e 65 65 64 20 74 6f 20 62 65 20 70 65 72 73   need to be pers
13760 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 7a  istent..  */.  z
13770 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 7a 50 61 74  StmtJrnl = &zPat
13780 68 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  hname[nPathname+
13790 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  1];.  rc = sqlit
137a0 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65 28  e3OsGetTempname(
137b0 70 56 66 73 2c 20 70 56 66 73 2d 3e 6d 78 50 61  pVfs, pVfs->mxPa
137c0 74 68 6e 61 6d 65 2b 31 2c 20 7a 53 74 6d 74 4a  thname+1, zStmtJ
137d0 72 6e 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  rnl);.  if( rc!=
137e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
137f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
13800 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
13810 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e  turn rc;.  }.  n
13820 53 74 6d 74 4a 72 6e 6c 20 3d 20 73 74 72 6c 65  StmtJrnl = strle
13830 6e 28 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 0a 20  n(zStmtJrnl);.. 
13840 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
13850 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65  ory for the page
13860 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
13870 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
13880 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
13890 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
138a0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
138b0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
138c0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
138d0 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20  leSize +        
138e0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
138f0 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  l file structure
13900 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73   */ .    pVfs->s
13910 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20  zOsFile * 3 +   
13920 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
13930 20 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72   db and two jour
13940 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
13950 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20    3*nPathname + 
13960 34 30 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a  40 +          /*
13970 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72   zFilename, zDir
13980 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c  ectory, zJournal
13990 20 2a 2f 0a 20 20 20 20 6e 53 74 6d 74 4a 72 6e   */.    nStmtJrn
139a0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
139b0 20 20 20 20 2f 2a 20 7a 53 74 6d 74 4a 72 6e 6c      /* zStmtJrnl
139c0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21   */.  );.  if( !
139d0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71  pPager ){.    sq
139e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
139f0 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
13a00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13a10 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38    }.  pPtr = (u8
13a20 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
13a30 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
13a40 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20  s = vfsFlags;.  
13a50 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71  pPager->fd = (sq
13a60 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
13a70 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
13a80 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  *0];.  pPager->s
13a90 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  tfd = (sqlite3_f
13aa0 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
13ab0 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20  >szOsFile*1];.  
13ac0 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73  pPager->jfd = (s
13ad0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
13ae0 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
13af0 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*2];.  pPager->
13b00 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
13b10 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  r*)&pPtr[pVfs->s
13b20 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61  zOsFile*2+journa
13b30 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
13b40 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13b50 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
13b60 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
13b70 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a  1];.  pPager->zJ
13b80 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72  ournal = &pPager
13b90 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61  ->zDirectory[nPa
13ba0 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
13bb0 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d  ger->zStmtJrnl =
13bc0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
13bd0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30 5d  al[nPathname+10]
13be0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  ;.  pPager->pVfs
13bf0 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63 70   = pVfs;.  memcp
13c00 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
13c10 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
13c20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
13c30 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
13c40 53 74 6d 74 4a 72 6e 6c 2c 20 7a 53 74 6d 74 4a  StmtJrnl, zStmtJ
13c50 72 6e 6c 2c 20 6e 53 74 6d 74 4a 72 6e 6c 2b 31  rnl, nStmtJrnl+1
13c60 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13c70 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20  e(zPathname);.. 
13c80 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
13c90 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
13ca0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
13cb0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
13cc0 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
13cd0 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56  f( nPathname>(pV
13ce0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d  fs->mxPathname -
13cf0 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61   sizeof("-journa
13d00 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63  l")) ){.      rc
13d10 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
13d20 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
13d30 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
13d40 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
13d50 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
13d60 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13d70 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
13d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13d90 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13da0 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  ->vfsFlags, &fou
13db0 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e  t);.      readOn
13dc0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
13dd0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
13de0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
13df0 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
13e00 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
13e10 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
13e20 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20  ccess,.      ** 
13e30 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
13e40 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
13e50 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
13e60 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  eate the.      *
13e70 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13e80 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
13e90 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
13ea0 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20  ximum of:.      
13eb0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  **.      **    +
13ec0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13ed0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20  PAGE_SIZE,.     
13ee0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
13ef0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
13f00 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
13f10 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ze().      **   
13f20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
13f30 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
13f40 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
13f50 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a  mically..      *
13f60 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
13f70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
13f80 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
13f90 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a    int iSectorSiz
13fa0 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
13fb0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
13fc0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
13fd0 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69 53   nDefaultPage<iS
13fe0 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
13ff0 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50         nDefaultP
14000 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  age = iSectorSiz
14010 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  e;.        }.#if
14020 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14030 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
14040 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
14050 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
14060 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14070 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
14080 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
14090 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
140a0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
140b0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
140c0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
140d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
140e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
140f0 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
14100 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
14110 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
14120 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
14130 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
14140 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44 65        for(ii=nDe
14150 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d 53  faultPage; ii<=S
14160 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
14170 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
14180 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
14190 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
141a0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
141b0 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66 61  (ii>>8)) ) nDefa
141c0 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20 20  ultPage = ii;.  
141d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
141e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
141f0 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
14200 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  age>SQLITE_MAX_D
14210 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
14220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44   ){.          nD
14230 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c  efaultPage = SQL
14240 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
14250 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
14260 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14270 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
14280 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20  memDb ){.    /* 
14290 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
142a0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
142b0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
142c0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
142d0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
142e0 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
142f0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
14300 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
14310 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
14320 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
14330 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
14340 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
14350 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
14360 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
14370 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
14380 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
14390 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
143a0 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
143b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
143c0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
143d0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
143e0 61 6c 6c 6f 63 28 6e 44 65 66 61 75 6c 74 50 61  alloc(nDefaultPa
143f0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
14400 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14410 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
14420 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
14430 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20  ..  ** Free the 
14440 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
14450 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
14460 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74  le..  ** Since t
14470 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
14480 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
14490 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
144a0 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
144b0 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
144c0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
144d0 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67  !pPager || !pPag
144e0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  er->pTmpSpace ){
144f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
14500 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
14510 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14520 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
14530 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
14540 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f  TE_OK)?SQLITE_NO
14550 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20  MEM:rc);.  }..  
14560 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45  PAGERTRACE3("OPE
14570 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
14580 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
14590 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
145a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  ilename);.  IOTR
145b0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
145c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
145d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
145e0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
145f0 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b  ager.zDirectory[
14600 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
14610 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14620 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
14630 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
14640 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  );.  for(i=strle
14650 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n(pPager->zDirec
14660 74 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50  tory); i>0 && pP
14670 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14680 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
14690 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
146a0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
146b0 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f  y[i-1] = 0;..  /
146c0 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
146d0 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20  zJournal[] */.  
146e0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
146f0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
14700 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
14710 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79  hname);.  memcpy
14720 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
14730 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
14740 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a  -journal", 9);..
14750 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
14760 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
14770 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
14780 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
14790 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
147a0 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
147b0 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
147c0 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
147d0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
147e0 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
147f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
14800 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
14810 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
14820 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
14830 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
14840 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
14850 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67  ze = nDefaultPag
14860 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  e;.  /* pPager->
14870 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
14880 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
14890 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
148a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
148b0 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
148c0 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
148d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  0;.  pPager->mxP
148e0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
148f0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
14900 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
14910 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
14920 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
14930 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
14940 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
14950 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
14960 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
14970 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
14980 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
14990 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
149a0 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
149b0 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
149c0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
149d0 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
149e0 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
149f0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14a00 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
14a10 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
14a20 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
14a30 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
14a40 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14a50 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20   = tempFile; .  
14a60 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
14a70 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
14a80 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
14a90 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
14aa0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
14ab0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
14ac0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
14ad0 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
14ae0 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
14af0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
14b00 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
14b10 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  );.  pPager->syn
14b20 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
14b30 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
14b40 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
14b50 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
14b60 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
14b70 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
14b80 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
14b90 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14ba0 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
14bb0 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
14bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
14bd0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14be0 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c  ||memDb||tempFil
14bf0 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  e);.  if( !memDb
14c00 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
14c10 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
14c20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
14c30 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
14c40 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
14c50 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
14c60 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
14c70 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
14c80 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
14c90 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
14ca0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14cb0 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
14cc0 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
14cd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55  ;.  pPager->iInU
14ce0 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20  seDB = 0;.  if( 
14cf0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  !memDb ){.    sq
14d00 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
14d10 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
14d20 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
14d30 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
14d40 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
14d50 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
14d60 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  x);.    pPager->
14d70 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50  pNext = sqlite3P
14d80 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66  agerList;.    if
14d90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  ( sqlite3PagerLi
14da0 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
14db0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
14dc0 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29  List->pPrev==0 )
14dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14de0 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20  agerList->pPrev 
14df0 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a  = pPager;.    }.
14e00 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
14e10 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  v = 0;.    sqlit
14e20 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
14e30 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
14e40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
14e50 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
14e60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14e70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
14e80 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
14e90 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
14ea0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
14eb0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
14ec0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
14ed0 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
14ee0 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
14ef0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
14f00 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
14f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14f20 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
14f30 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
14f40 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
14f50 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
14f60 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
14f70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
14f80 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
14f90 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
14fa0 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
14fb0 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
14fc0 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
14fd0 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
14fe0 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
14ff0 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
15000 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
15010 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
15020 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
15030 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
15040 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
15050 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
15060 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  led by sqlite3Pa
15070 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  gerUnref()..*/.v
15080 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
15090 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61  SetDestructor(Pa
150a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
150b0 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67  d (*xDesc)(DbPag
150c0 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
150d0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
150e0 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
150f0 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
15100 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
15110 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
15120 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
15130 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
15140 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
15150 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
15160 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
15170 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
15180 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
15190 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
151a0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
151b0 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
151c0 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
151d0 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
151e0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
151f0 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
15200 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
15210 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
15220 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
15230 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
15240 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
15250 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
15260 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e  init)(DbPage*,in
15270 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
15280 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
15290 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
152a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74   the page size t
152b0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66  o *pPageSize. If
152c0 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
152d0 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a   page size is.**
152e0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
152f0 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
15300 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
15310 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20   set to that.** 
15320 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
15330 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
15340 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
15350 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
15360 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
15370 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
15380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
15390 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
153a0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
153b0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
153c0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
153d0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
153e0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
153f0 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61  IZE) );.  if( pa
15400 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
15410 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
15420 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61  Size .   && !pPa
15430 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
15440 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20  ager->nRef==0 . 
15450 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
15460 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
15470 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65  ite3_malloc(page
15480 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
15490 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
154a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
154b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
154c0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
154d0 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ger);.      page
154e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
154f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
15500 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
15510 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63  ze;.      setSec
15520 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
15530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
15540 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
15550 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
15560 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
15570 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61  = pNew;.      pa
15580 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
15590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
155a0 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
155b0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
155c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
155d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
155e0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
155f0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
15600 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
15610 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
15620 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
15630 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
15640 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
15650 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
15660 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
15670 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
15680 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
15690 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
156a0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
156b0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
156c0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
156d0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
156e0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
156f0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
15700 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
15710 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
15720 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
15730 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
15740 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
15750 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
15760 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
15770 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
15780 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
15790 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
157a0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
157b0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
157c0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
157d0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
157e0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
157f0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
15800 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
15810 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
15820 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
15830 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
15840 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
15850 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
15860 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
15870 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
15880 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
15890 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
158a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
158b0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
158c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
158d0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
158e0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
158f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
15900 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
15910 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
15920 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
15930 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
15940 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
15950 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
15960 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
15970 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
15980 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
15990 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
159a0 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
159b0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
159c0 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
159d0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
159e0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
159f0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
15a00 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
15a10 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
15a20 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
15a30 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
15a40 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
15a50 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
15a60 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
15a70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
15a80 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15a90 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
15aa0 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
15ab0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
15ac0 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
15ad0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
15ae0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
15af0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
15b00 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
15b10 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
15b20 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
15b30 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
15b40 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
15b50 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
15b60 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
15b70 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
15b80 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
15b90 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
15ba0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
15bb0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
15bc0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
15bd0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
15be0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
15bf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
15c00 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
15c10 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
15c20 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
15c30 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
15c40 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
15c50 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
15c60 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
15c70 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
15c80 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
15c90 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
15ca0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
15cb0 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
15cc0 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
15cd0 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
15ce0 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
15cf0 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
15d00 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
15d10 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
15d20 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
15d30 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
15d40 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
15d50 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
15d60 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
15d70 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
15d80 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
15d90 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
15da0 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
15db0 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
15dc0 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
15dd0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
15de0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
15df0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
15e00 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
15e10 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
15e20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15e30 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
15e40 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
15e50 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70   assert(MEMDB||p
15e60 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15e70 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
15e80 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50  pFile);.  if( pP
15e90 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15ea0 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ds ){.    IOTRAC
15eb0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
15ec0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
15ed0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
15ee0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
15ef0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
15f00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15f10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
15f20 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
15f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15f50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f60 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
15f70 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15f80 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
15f90 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
15fa0 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
15fb0 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
15fc0 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
15fd0 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
15fe0 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
15ff0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
16000 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
16010 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
16020 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
16030 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
16040 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
16050 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
16060 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
16070 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
16080 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
16090 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
160a0 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
160b0 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
160c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
160d0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
160e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
160f0 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  n = 0;.  int rc;
16100 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16110 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
16120 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
16130 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
16140 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
16150 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
16160 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
16170 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
16180 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
16190 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
161a0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
161b0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
161c0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
161d0 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
161e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
161f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
16200 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
16210 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16220 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
16230 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16240 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
16250 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
16260 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
16270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
16280 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
16290 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
162a0 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   n = 1;.    }els
162b0 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50  e{.      n /= pP
162c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
162d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
162e0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
162f0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
16300 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
16310 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = n;.    }.  }
16320 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
16330 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
16340 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
16350 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
16360 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n>pPager->mxPgno
16370 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
16380 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a  mxPgno = n;.  }.
16390 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
163a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
163b0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
163c0 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
163d0 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
163e0 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
163f0 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
16400 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
16410 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
16420 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
16430 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53  3_free(pHist->pS
16440 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
16450 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
16460 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
16470 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
16480 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
16490 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
164a0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
164b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
164c0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
164d0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
164e0 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61   pPg from its ha
164f0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
16500 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
16510 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
16520 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
16530 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
16540 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
16550 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
16560 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
16570 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
16580 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69  Movepage() routi
16590 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70  ne can leave a p
165a0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70  age in the .** p
165b0 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72  NextFree/pPrevFr
165c0 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  ee list that is 
165d0 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e  not a part of an
165e0 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f  y hash-chain..*/
165f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
16600 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67  inkHashChain(Pag
16610 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
16620 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
16630 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
16640 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
16650 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
16660 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
16670 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
16680 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
16690 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
166a0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
166b0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
166c0 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
166d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
166e0 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
166f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
16700 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28  sh[pPg->pgno & (
16710 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
16720 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
16730 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
16740 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
16750 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
16760 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
16770 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
16780 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
16790 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
167a0 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
167b0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  ash;.  }.  if( M
167c0 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61  EMDB ){.    clea
167d0 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
167e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
167f0 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  er));.  }.  pPg-
16800 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
16810 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
16820 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
16830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
16840 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
16850 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
16860 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
16870 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
16880 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
16890 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
168a0 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
168b0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
168c0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
168d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
168e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
168f0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
16900 66 72 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a  free page list *
16910 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76  /.  lruListRemov
16920 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e  e(pPg);..  /* Un
16930 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67  link from the pg
16940 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  no hash table */
16950 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
16960 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
16970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16980 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
16990 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63  o truncate the c
169a0 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61  ache when a data
169b0 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63  base.** is trunc
169c0 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d  ated.  Drop from
169d0 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70   the cache all p
169e0 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
169f0 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61  is.** larger tha
16a00 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
16a10 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
16a20 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  nced..**.** Refe
16a30 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72  renced pages lar
16a40 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
16a50 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f  >dbSize are zero
16a60 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c  ed..**.** Actual
16a70 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ly, at the point
16a80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16a90 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c   called, it woul
16aa0 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  d be.** an error
16ab0 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72   to have a refer
16ac0 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74  enced page.  But
16ad0 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c   rather than del
16ae0 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ete.** that page
16af0 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61   and guarantee a
16b00 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66   subsequent segf
16b10 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62  ault, it seems b
16b20 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f  etter.** to zero
16b30 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61   it and hope tha
16b40 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73  t we error out s
16b50 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  anely..*/.static
16b60 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e   void pager_trun
16b70 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72  cate_cache(Pager
16b80 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
16b90 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
16ba0 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
16bb0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
16bc0 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
16bd0 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
16be0 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
16bf0 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
16c00 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
16c10 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
16c20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
16c30 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
16c40 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
16c50 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
16c60 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
16c70 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
16c80 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16c90 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
16ca0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
16cb0 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
16cc0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
16cd0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
16ce0 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
16cf0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
16d00 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
16d10 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
16d20 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
16d30 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  nt);.      unlin
16d40 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
16d50 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
16d60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
16d70 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  free(pPg->pData)
16d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
16d90 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
16da0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
16db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
16dc0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
16dd0 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
16de0 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
16df0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
16e00 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
16e10 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
16e20 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
16e30 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
16e40 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
16e50 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
16e60 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
16e70 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
16e80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16e90 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
16ea0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
16eb0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
16ec0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
16ed0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
16ee0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
16ef0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
16f00 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
16f10 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
16f20 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
16f30 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
16f40 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
16f50 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
16f60 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
16f70 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
16f80 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
16f90 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
16fa0 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
16fb0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
16fc0 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
16fd0 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
16fe0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
16ff0 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
17000 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
17010 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
17020 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
17030 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
17040 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
17050 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20  er->dbSize<0 || 
17060 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20  MEMDB );..  if( 
17070 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
17080 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
17090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
170a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
170b0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
170c0 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70  dler ) pPager->p
170d0 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75  BusyHandler->nBu
170e0 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b  sy = 0;.    do {
170f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17100 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
17110 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
17120 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
17130 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
17140 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
17150 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
17160 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
17170 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17190 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
171a0 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20   locktype;.     
171b0 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
171c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
171d0 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20  , locktype)).   
171e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
171f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
17200 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
17210 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
17220 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
17230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17240 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
17250 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
17260 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
17270 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
17280 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
17290 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44  R_SHARED || MEMD
172a0 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  B );.  sqlite3Pa
172b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
172c0 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
172d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
172e0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
172f0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74  errCode;.    ret
17300 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
17310 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
17320 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
17330 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
17340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17350 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
17360 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
17370 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
17380 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
17390 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
173a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
173b0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74  ;.  }.  pagerEnt
173c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
173d0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
173e0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c  Pager);.  pagerL
173f0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
17400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17410 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
17420 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rc;.  }..  /* Ge
17430 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
17440 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17450 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
17460 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65  ating. */.  page
17470 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
17480 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
17490 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
174a0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
174b0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
174c0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
174d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
174e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
174f0 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72   }..  rc = pager
17500 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
17510 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75  , nPage);.  retu
17520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17530 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
17540 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
17550 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
17560 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
17570 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
17580 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
17590 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
175a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
175b0 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
175c0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
175d0 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
175e0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
175f0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
17600 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
17610 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
17620 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
17630 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
17640 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
17650 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
17660 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17670 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
17680 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
17690 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
176a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
176b0 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
176c0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
176d0 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
176e0 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
176f0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
17700 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
17710 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
17720 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
17730 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
17740 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
17750 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
17760 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
17770 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
17780 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17790 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
177a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
177b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
177c0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
177d0 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  ENT.  if( !MEMDB
177e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
177f0 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73  mutex *mutex = s
17800 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
17810 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
17820 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20  STATIC_MEM2);.  
17830 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17840 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20  enter(mutex);.  
17850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50    if( pPager->pP
17860 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rev ){.      pPa
17870 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ger->pPrev->pNex
17880 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
17890 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
178a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
178b0 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  List = pPager->p
178c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
178d0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  if( pPager->pNex
178e0 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  t ){.      pPage
178f0 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
17900 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b  = pPager->pPrev;
17910 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17920 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
17930 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  utex);.  }.#endi
17940 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  f..  disable_sim
17950 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17960 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75  ();.  sqlite3Fau
17970 6c 74 42 65 6e 69 67 6e 28 2d 31 2c 20 31 29 3b  ltBenign(-1, 1);
17980 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
17990 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
179a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
179b0 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
179c0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
179d0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
179e0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
179f0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
17a00 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
17a10 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
17a20 67 6e 28 2d 31 2c 20 30 29 3b 0a 20 20 50 41 47  gn(-1, 0);.  PAG
17a30 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20  ERTRACE2("CLOSE 
17a40 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
17a50 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
17a60 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
17a70 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69 66 28  , pPager)).  if(
17a80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17a90 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
17aa0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
17ab0 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
17ac0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
17ad0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
17ae0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
17af0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
17b00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
17b10 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
17b20 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
17b30 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
17b40 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
17b50 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
17b60 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
17b70 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
17b80 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
17b90 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
17ba0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
17bb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
17bc0 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
17bd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17be0 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
17bf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
17c00 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
17c10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
17c20 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
17c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17c40 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
17c50 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
17c60 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
17c70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
17c80 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
17c90 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
17ca0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
17cb0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
17cc0 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
17cd0 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
17ce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17cf0 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
17d00 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
17d10 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
17d20 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
17d30 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
17d40 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
17d50 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
17d60 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
17d70 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
17d80 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
17d90 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
17da0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
17db0 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
17dc0 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
17dd0 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
17de0 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
17df0 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
17e00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
17e10 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
17e20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
17e30 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
17e40 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
17e50 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
17e60 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
17e70 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
17e80 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
17e90 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
17ea0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
17eb0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
17ec0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
17ed0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
17ee0 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
17ef0 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76      lruListRemov
17f00 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  e(pPg);.    pPg-
17f10 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
17f20 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
17f30 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ++;.}.#ifdef SQL
17f40 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74  ITE_DEBUG.  stat
17f50 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66  ic void page_ref
17f60 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
17f70 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
17f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67  =0 ){.      _pag
17f90 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  e_ref(pPg);.    
17fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
17fb0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
17fc0 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
17fd0 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
17fe0 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
17ff0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
18000 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
18010 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
18020 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
18030 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
18040 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
18050 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
18060 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
18070 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
18080 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
18090 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
180a0 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
180b0 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
180c0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
180d0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d   pagerLeave(pPg-
180e0 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  >pPager);.  retu
180f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18100 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
18110 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
18120 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
18130 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
18140 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
18150 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
18160 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
18170 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
18180 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
18190 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
181a0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
181b0 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
181c0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
181d0 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
181e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
181f0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
18200 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
18210 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
18220 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
18230 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
18240 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
18250 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
18260 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
18270 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
18280 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
18290 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
182a0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
182b0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
182c0 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
182d0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
182e0 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
182f0 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
18300 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
18310 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
18320 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
18330 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
18340 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
18350 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
18360 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
18370 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
18380 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
18390 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
183a0 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
183b0 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
183c0 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
183d0 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
183e0 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
183f0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
18400 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
18410 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
18420 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
18430 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
18440 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
18450 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
18460 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
18470 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
18480 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
18490 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
184a0 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
184b0 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
184c0 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
184d0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
184e0 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
184f0 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
18500 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
18510 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
18520 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
18530 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
18540 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
18550 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
18560 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
18570 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
18580 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
18590 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
185a0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
185b0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
185c0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
185d0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
185e0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
185f0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
18600 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18610 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
18620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18630 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  OK;...  /* Sync 
18640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
18650 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
18660 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
18670 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
18680 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
18690 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
186a0 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
186b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
186c0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
186d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
186e0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  pFile ){.      i
186f0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
18700 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
18710 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
18720 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
18730 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
18740 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20  alOpen );..     
18750 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
18760 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
18770 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
18780 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
18790 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
187a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
187b0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
187c0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
187d0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
187e0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
187f0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
18800 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
18810 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
18820 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
18830 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
18840 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
18850 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
18860 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
18870 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
18880 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
18890 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
188a0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
188b0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
188c0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
188d0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
188e0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
188f0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
18900 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
18910 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
18920 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
18930 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
18940 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
18950 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
18960 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
18970 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
18980 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
18990 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
189a0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
189b0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
189c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
189d0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
189e0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
189f0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66  lOff;.        if
18a00 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
18a10 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
18a20 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
18a30 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
18a40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
18a50 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
18a60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18a70 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
18a80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
18a90 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
18aa0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
18ab0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
18ac0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
18ad0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
18ae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18af0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
18b00 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
18b10 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d         jrnlOff =
18b20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18b30 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
18b40 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
18b50 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
18b60 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
18b70 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f  ", pPager, jrnlO
18b80 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  ff, 4));.       
18b90 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
18ba0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
18bb0 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  rnlOff, pPager->
18bc0 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
18bd0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
18be0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18bf0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
18c00 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
18c10 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
18c20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
18c30 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
18c40 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18c50 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49  ger));.        I
18c60 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
18c70 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
18c80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18c90 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
18ca0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
18cb0 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
18cc0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
18cd0 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
18ce0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
18cf0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
18d00 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
18d10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
18d20 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
18d30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
18d40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
18d50 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
18d60 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
18d70 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
18d80 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
18d90 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
18da0 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
18db0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
18dc0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
18dd0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
18de0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
18df0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
18e00 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74  }.    lruListSet
18e10 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67  FirstSynced(pPag
18e20 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  er);.  }..#ifnde
18e30 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
18e40 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
18e50 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
18e60 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
18e70 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
18e80 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
18e90 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
18ea0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
18eb0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
18ec0 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
18ed0 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
18ee0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
18ef0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
18f00 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
18f10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18f20 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
18f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18f40 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e  rt( pPager->lru.
18f50 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
18f60 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
18f70 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
18f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18f90 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20  /*.** Merge two 
18fa0 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63  lists of pages c
18fb0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
18fc0 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f  ty and in pgno o
18fd0 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rder..** Do not 
18fe0 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20  both fixing the 
18ff0 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
19000 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ers..*/.static P
19010 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65  gHdr *merge_page
19020 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20  list(PgHdr *pA, 
19030 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67  PgHdr *pB){.  Pg
19040 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61  Hdr result, *pTa
19050 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72  il;.  pTail = &r
19060 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20  esult;.  while( 
19070 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20  pA && pB ){.    
19080 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d  if( pA->pgno<pB-
19090 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  >pgno ){.      p
190a0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
190b0 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  A;.      pTail =
190c0 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20   pA;.      pA = 
190d0 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pA->pDirty;.    
190e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
190f0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
19100 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
19110 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42  B;.      pB = pB
19120 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
19130 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a    }.  if( pA ){.
19140 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19150 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20  y = pA;.  }else 
19160 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54  if( pB ){.    pT
19170 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
19180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19190 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30  Tail->pDirty = 0
191a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
191b0 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a  esult.pDirty;.}.
191c0 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20  ./*.** Sort the 
191d0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  list of pages in
191e0 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
191f0 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73   by pgno.  Pages
19200 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65   are.** connecte
19210 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e  d by pDirty poin
19220 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76  ters.  The pPrev
19230 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61  Dirty pointers a
19240 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20  re.** corrupted 
19250 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f  by this sort..*/
19260 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
19270 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a  BUCKET_ALLOC 25.
19280 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
19290 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23  UCKET       25.#
192a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
192b0 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  T.  int sqlite3_
192c0 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
192d0 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65  ket = 0;.  #unde
192e0 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a  f N_SORT_BUCKET.
192f0 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54    #define N_SORT
19300 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71  _BUCKET \.   (sq
19310 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
19320 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65  rt_bucket?sqlite
19330 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
19340 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43  ucket:N_SORT_BUC
19350 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69  KET_ALLOC).#endi
19360 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  f.static PgHdr *
19370 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67  sort_pagelist(Pg
19380 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48  Hdr *pIn){.  PgH
19390 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43  dr *a[N_SORT_BUC
193a0 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a  KET_ALLOC], *p;.
193b0 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65    int i;.  memse
193c0 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
193d0 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  ));.  while( pIn
193e0 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b   ){.    p = pIn;
193f0 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44  .    pIn = p->pD
19400 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
19410 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  rty = 0;.    for
19420 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=0; i<N_SORT_B
19430 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20  UCKET-1; i++){. 
19440 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30       if( a[i]==0
19450 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d   ){.        a[i]
19460 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72   = p;.        br
19470 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
19480 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65  {.        p = me
19490 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
194a0 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61  ], p);.        a
194b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
194c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
194d0 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  ==N_SORT_BUCKET-
194e0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  1 ){.      /* Co
194f0 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68  verage: To get h
19500 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20  ere, there need 
19510 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f  to be 2^(N_SORT_
19520 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a  BUCKET) .      *
19530 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  * elements in th
19540 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68  e input list. Th
19550 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20  is is possible, 
19560 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e  but impractical.
19570 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e  .      ** Testin
19580 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74  g this line is t
19590 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62  he point of glob
195a0 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  al variable.    
195b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67    ** sqlite3_pag
195c0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
195d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
195e0 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61   a[i] = merge_pa
195f0 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
19600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
19610 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31   a[0];.  for(i=1
19620 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
19630 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  T; i++){.    p =
19640 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
19650 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  p, a[i]);.  }.  
19660 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
19670 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
19680 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
19690 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
196a0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
196b0 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
196c0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
196d0 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
196e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
196f0 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
19700 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
19710 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
19720 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
19730 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
19740 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
19750 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20  PgHdr *p;.  int 
19760 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
19770 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
19780 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
19790 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
197a0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
197b0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
197c0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
197d0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
197e0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
197f0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
19800 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
19810 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
19820 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
19830 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
19840 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
19850 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
19860 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
19870 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
19880 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
19890 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
198a0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
198b0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
198c0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
198d0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
198e0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
198f0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
19900 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
19910 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
19920 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
19930 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
19940 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
19950 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
19960 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
19970 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
19980 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
19990 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
199a0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
199b0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
199c0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
199d0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
199e0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
199f0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
19a00 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
19a10 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
19a20 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
19a30 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
19a40 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
19a50 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
19a60 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
19a70 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
19a80 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
19a90 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
19aa0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
19ab0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
19ac0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
19ad0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
19ae0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
19af0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
19b00 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
19b10 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
19b20 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
19b30 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
19b40 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
19b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19b60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19b70 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
19b80 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
19b90 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  t);.  for(p=pLis
19ba0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
19bb0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
19bc0 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  p->dirty );.    
19bd0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
19be0 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  }.  while( pList
19bf0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
19c00 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
19c10 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
19c20 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
19c30 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
19c40 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
19c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  {.      assert(p
19c60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
19c70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
19c80 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
19c90 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  p(pPager->pVfs, 
19ca0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
19cb0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er->zFilename,. 
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19ce0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
19cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
19d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19d10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
19d20 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
19d30 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
19d40 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
19d50 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
19d60 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
19d70 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
19d80 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
19d90 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
19da0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
19db0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
19dc0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
19dd0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
19de0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
19df0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
19e00 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
19e10 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
19e20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
19e30 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
19e40 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ze ){.      i64 
19e50 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d  offset = (pList-
19e60 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
19e70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19e80 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
19e90 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
19ea0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
19eb0 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
19ec0 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
19ed0 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f  PAGERTRACE4("STO
19ee0 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
19ef0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
19f20 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61   pList->pgno, pa
19f30 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
19f40 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  st));.      IOTR
19f50 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
19f60 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
19f70 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
19f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19f90 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
19fa0 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
19fb0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
19fc0 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  et);.      PAGER
19fd0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
19fe0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
19ff0 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
1a000 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
1a010 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ite);.      if( 
1a020 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1a030 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1a040 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1a050 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
1a060 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1a070 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1a080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
1a090 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1a0a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
1a0b0 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45  RTRACE3("NOSTORE
1a0c0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1a0d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1a0e0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1a0f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a100 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a110 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
1a120 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1a130 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
1a140 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1a150 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
1a160 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
1a170 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
1a180 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a190 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
1a1a0 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
1a1b0 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
1a1c0 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
1a1d0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1a1e0 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
1a1f0 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
1a200 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
1a210 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
1a220 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
1a230 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1a240 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
1a250 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1a260 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a270 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a280 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65  .  /* Verify the
1a290 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20 64   sanity of the d
1a2a0 69 72 74 79 20 6c 69 73 74 20 77 68 65 6e 20 77  irty list when w
1a2b0 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20  e are running.  
1a2c0 2a 2a 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20  ** in debugging 
1a2d0 6d 6f 64 65 2e 20 20 54 68 69 73 20 69 73 20 65  mode.  This is e
1a2e0 78 70 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20  xpensive, so do 
1a2f0 6e 6f 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73  not.  ** do this
1a300 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69   on a normal bui
1a310 6c 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20  ld. */.  int n1 
1a320 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20  = 0;.  int n2 = 
1a330 30 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  0;.  PgHdr *p;. 
1a340 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1a350 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
1a360 78 74 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64  xtAll){ if( p->d
1a370 69 72 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20  irty ) n1++; }. 
1a380 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1a390 44 69 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70  Dirty; p; p=p->p
1a3a0 44 69 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a  Dirty){ n2++; }.
1a3b0 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32    assert( n1==n2
1a3c0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65   );.#endif..  re
1a3d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
1a3e0 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
1a3f0 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
1a400 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
1a410 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1a420 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f  ger..** A hot jo
1a430 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
1a440 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  t needs to be pl
1a450 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  ayed back..**.**
1a460 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1a470 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a480 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
1a490 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
1a4a0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
1a4b0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
1a4c0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
1a4d0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
1a4e0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
1a4f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
1a500 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65  me.  Just delete
1a510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1a520 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74  .** Return negat
1a530 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  ive if unable to
1a540 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1a550 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75  tatus of the jou
1a560 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
1a570 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
1a580 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1a590 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1a5a0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1a5b0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pVfs;.  int rc;.
1a5c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
1a5d0 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
1a5e0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61  rn 0;.  if( !pPa
1a5f0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1a600 73 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  s ) return 0;.  
1a610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1a620 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
1a630 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
1a640 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1a650 53 29 3b 0a 20 20 69 66 28 20 72 63 3c 3d 30 20  S);.  if( rc<=0 
1a660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1a670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1a680 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
1a690 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
1a6a0 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
1a6b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
1a6c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1a6d0 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
1a6e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
1a6f0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
1a700 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
1a710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1a730 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
1a740 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
1a750 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
1a760 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
1a770 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
1a780 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
1a790 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1a7a0 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
1a7b0 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
1a7c0 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
1a7d0 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
1a7e0 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
1a7f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a800 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
1a810 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1a820 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
1a830 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
1a840 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74  Pg = 0;..  /* It
1a850 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
1a860 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1a870 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67  n unless the pag
1a880 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70  er object.  ** p
1a890 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61  ointed to by pPa
1a8a0 67 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74  ger has at least
1a8b0 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28   one free page (
1a8c0 70 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d  page with nRef==
1a8d0 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  0)..  */ .  asse
1a8e0 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73  rt(!MEMDB);.  as
1a8f0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
1a900 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20  .pFirst);..  /* 
1a910 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
1a920 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
1a930 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
1a940 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1a950 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
1a960 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
1a970 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  the journal..  *
1a980 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72  /.  pPg = pPager
1a990 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1a9a0 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
1a9b0 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
1a9c0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
1a9d0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
1a9e0 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
1a9f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1aa00 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
1aa10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
1aa20 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
1aa30 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
1aa40 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
1aa50 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
1aa60 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
1aa70 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
1aa80 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
1aa90 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
1aaa0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 7b  er->lru.pFirst){
1aab0 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73  .    int iDc = s
1aac0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1aad0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1aae0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69  ager->fd);.    i
1aaf0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
1ab00 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1ab10 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1ab20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ab30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
1ab40 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1ab50 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1ab60 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1ab70 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  D) ){.      /* I
1ab80 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
1ab90 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
1aba0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1abb0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
1abc0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1abd0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
1abe0 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
1abf0 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
1ac00 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
1ac10 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
1ac20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
1ac30 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
1ac40 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
1ac50 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1ac60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ac70 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
1ac80 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
1ac90 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
1aca0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
1acb0 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
1acc0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
1acd0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1ace0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1acf0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
1ad00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ad10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1ad20 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
1ad30 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1ad40 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1ad50 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1ad60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ad70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1ad80 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
1ad90 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20  r->lru.pFirst;. 
1ada0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
1adb0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
1adc0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
1add0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
1ade0 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
1adf0 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
1ae00 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
1ae10 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1ae20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
1ae30 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
1ae40 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1ae50 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1ae60 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
1ae70 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
1ae80 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1ae90 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
1aea0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1aeb0 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   0;.    if( rc!=
1aec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aed0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1aee0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
1aef0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
1af00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1af10 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
1af20 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
1af30 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
1af40 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
1af50 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
1af60 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
1af70 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
1af80 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
1af90 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1afa0 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
1afb0 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
1afc0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1afd0 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
1afe0 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
1aff0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
1b000 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
1b010 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
1b020 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
1b030 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
1b040 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
1b050 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
1b060 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
1b070 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
1b080 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
1b090 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
1b0a0 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
1b0b0 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
1b0c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
1b0d0 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
1b0e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
1b0f0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
1b100 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
1b110 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20  ALWAYS_ROLLBACK 
1b120 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1b130 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
1b140 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
1b150 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1b160 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
1b170 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
1b180 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
1b190 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e  ble.  */.  unlin
1b1a0 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73  kPage(pPg);.  as
1b1b0 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
1b1c0 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  =0 );..  *ppPg =
1b1d0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1b1e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1b1f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1b200 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
1b210 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
1b220 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b230 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
1b240 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
1b250 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
1b260 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
1b270 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
1b280 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
1b290 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
1b2a0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
1b2b0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
1b2c0 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
1b2d0 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a  te3_free()ed..**
1b2e0 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20  .** nReq is the 
1b2f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1b300 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  of memory requir
1b310 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75  ed. Once this mu
1b320 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72  ch has.** been r
1b330 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e  eleased, the fun
1b340 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54  ction returns. T
1b350 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1b360 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1b370 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
1b380 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
1b390 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1b3a0 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d  te3PagerReleaseM
1b3b0 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b  emory(int nReq){
1b3c0 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
1b3d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1b3e0 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
1b3f0 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66 61  y released so fa
1b400 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  r */.  sqlite3_m
1b410 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1b420 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d     /* The MEM2 m
1b430 75 74 65 78 20 2a 2f 0a 20 20 50 61 67 65 72 20  utex */.  Pager 
1b440 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b450 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1b460 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73  ping over pagers
1b470 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
1b480 72 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20  r *savedBusy;   
1b490 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20    /* Saved copy 
1b4a0 6f 66 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  of the busy hand
1b4b0 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ler */.  int rc 
1b4c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1b4d0 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
1b4e0 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
1b4f0 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 6d 75   mutex.  */.  mu
1b500 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1b510 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1b520 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
1b530 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  M2);.  sqlite3_m
1b540 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
1b550 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20  );..  /* Signal 
1b560 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
1b570 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65  nections that me
1b580 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1b590 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61  wants.  ** to ha
1b5a0 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ve access to the
1b5b0 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   pagers..  */.  
1b5c0 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74  for(pPager=sqlit
1b5d0 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61  e3PagerList; pPa
1b5e0 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67  ger; pPager=pPag
1b5f0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1b600 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
1b610 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  M = 1;.  }..  wh
1b620 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1b630 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  OK && (nReq<0 ||
1b640 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
1b650 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1b660 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  Pg;.    PgHdr *p
1b670 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20  Recycled;. .    
1b680 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
1b690 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
1b6a0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1b6b0 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1b6c0 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   If.    ** this 
1b6d0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1b6e0 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 64   find one that d
1b6f0 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73 79  oes require a sy
1b700 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nc()..    */.   
1b710 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1b720 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
1b730 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1b740 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
1b750 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  ));.    pPg = sq
1b760 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
1b770 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20  .pFirstSynced;. 
1b780 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
1b790 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20   (pPg->needSync 
1b7a0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
1b7b0 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20  iInUseDB) ){.   
1b7c0 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1b7d0 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ree.pNext;.    }
1b7e0 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 7b  .    if( !pPg ){
1b7f0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
1b800 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
1b810 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68  pFirst;.      wh
1b820 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67 2d  ile( pPg && pPg-
1b830 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44  >pPager->iInUseD
1b840 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  B ){.        pPg
1b850 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e   = pPg->gfree.pN
1b860 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1b870 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
1b880 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1b890 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1b8a0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1b8b0 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f  IC_LRU));..    /
1b8c0 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74 68 65  * If pPg==0, the
1b8d0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
1b8e0 65 20 68 61 73 20 66 61 69 6c 65 64 20 74 6f 20  e has failed to 
1b8f0 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 0a 20  find a page to. 
1b900 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49     ** recycle. I
1b910 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74 75  n this case retu
1b920 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75  rn early - no fu
1b930 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c  rther memory wil
1b940 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c 65  l.    ** be rele
1b950 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ased..    */.   
1b960 20 69 66 28 20 21 70 50 67 20 29 20 62 72 65 61   if( !pPg ) brea
1b970 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 20 3d  k;..    pPager =
1b980 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1b990 20 20 61 73 73 65 72 74 28 21 70 50 67 2d 3e 6e    assert(!pPg->n
1b9a0 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d  eedSync || pPg==
1b9b0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1b9c0 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  st);.    assert(
1b9d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1b9e0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1b9f0 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  u.pFirstSynced);
1ba00 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42 75 73  .  .    savedBus
1ba10 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73  y = pPager->pBus
1ba20 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50  yHandler;.    pP
1ba30 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1ba40 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  er = 0;.    rc =
1ba50 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1ba60 50 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65  Pager, &pRecycle
1ba70 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
1ba80 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 73  pBusyHandler = s
1ba90 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20 61 73  avedBusy;.    as
1baa0 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d  sert(pRecycled==
1bab0 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  pPg || rc!=SQLIT
1bac0 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  E_OK);.    if( r
1bad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bae0 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
1baf0 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
1bb00 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
1bb10 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
1bb20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  been .      ** r
1bb30 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1bb40 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
1bb50 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
1bb60 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
1bb70 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
1bb80 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
1bb90 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
1bba0 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
1bbb0 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
1bbc0 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
1bbd0 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
1bbe0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1bbf0 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
1bc00 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
1bc10 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
1bc20 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
1bc30 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61   .      ** proba
1bc40 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20  bly is though.. 
1bc50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
1bc60 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
1bc70 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
1bc80 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
1bc90 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1bca0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bcb0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
1bcc0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tAll;.      }els
1bcd0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e{.        for( 
1bce0 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pTmp=pPager->pAl
1bcf0 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
1bd00 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
1bd10 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
1bd20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
1bd30 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
1bd40 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  extAll;.      }.
1bd50 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1bd60 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1bd70 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1bd80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1bd90 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1bda0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1bdb0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1bdc0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1bdd0 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1bde0 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1bdf0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1be00 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1be10 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1be20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1be30 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1be40 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1be50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1be60 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
1be70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1be80 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
1be90 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
1bea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1beb0 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
1bec0 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
1bed0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1bee0 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a  file or .      *
1bef0 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
1bf00 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
1bf10 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
1bf20 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
1bf30 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
1bf40 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1bf50 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
1bf60 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
1bf70 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
1bf80 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
1bf90 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
1bfa0 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
1bfb0 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
1bfc0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  e .      ** of a
1bfd0 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
1bfe0 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
1bff0 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1c000 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
1c010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
1c020 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
1c030 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
1c040 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20  E_IOERR ||.     
1c050 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1c060 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  FULL ||.        
1c070 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53    rc==SQLITE_BUS
1c080 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  Y.      );.     
1c090 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c0a0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1c0b0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
1c0c0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1c0d0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
1c0e0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74   }..  /* Clear t
1c0f0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
1c100 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72  ment flags and r
1c110 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1c120 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1c130 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1c140 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1c150 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1c160 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1c170 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
1c180 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1c190 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
1c1a0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1c1b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c1c0 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a  s released.  */.
1c1d0 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
1c1e0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
1c1f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1c200 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
1c210 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
1c220 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1c230 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1c240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c260 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
1c270 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1c280 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
1c290 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
1c2a0 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
1c2b0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
1c2c0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1c2d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
1c2e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1c2f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1c300 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1c310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c320 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1c330 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
1c340 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1c350 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1c360 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1c370 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1c380 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
1c390 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1c3a0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1c3b0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1c3c0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1c3d0 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1c3e0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1c3f0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1c400 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1c410 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1c420 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  o));.  if( pgno=
1c430 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 ){.    memcpy
1c440 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1c450 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48  Vers, &((u8*)PGH
1c460 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
1c470 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
1c4b0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1c4c0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1c4d0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
1c4e0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
1c4f0 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52  gno, 3);.  PAGER
1c500 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64  TRACE4("FETCH %d
1c510 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1c520 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1c530 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1c540 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c550 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1c560 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72  h(pPg));.  retur
1c570 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c590 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1c5a0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
1c5b0 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
1c5c0 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
1c5d0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
1c5e0 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
1c5f0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
1c600 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
1c610 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
1c620 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1c630 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
1c640 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
1c650 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
1c660 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
1c670 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
1c680 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
1c690 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1c6a0 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
1c6b0 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
1c6c0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
1c6d0 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
1c6e0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
1c6f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1c700 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
1c710 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1c720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c730 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b    int isHot = 0;
1c740 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
1c750 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
1c760 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
1c770 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
1c780 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
1c790 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
1c7a0 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
1c7b0 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
1c7c0 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  s the chance to 
1c7d0 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
1c7e0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
1c7f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1c800 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
1c810 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
1c820 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
1c830 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
1c840 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
1c850 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1c860 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1c870 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
1c880 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
1c890 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
1c8a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c8b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
1c8c0 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Hot = 1;.    }. 
1c8d0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1c8e0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1c8f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
1c900 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1c910 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
1c920 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65  is still in an e
1c930 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1c940 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20  ot proceed. The 
1c950 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74  error .  ** stat
1c960 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  e will be cleare
1c970 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
1c980 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68  in the future wh
1c990 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a  en all page .  *
1c9a0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65  * references are
1c9b0 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65   dropped and the
1c9c0 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
1c9d0 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20  scarded..  */.  
1c9e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1c9f0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1ca00 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1ca10 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1ca20 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1ca30 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  e;.  }..  if( pP
1ca40 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1ca50 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48  ER_UNLOCK || isH
1ca60 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ot ){.    sqlite
1ca70 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1ca80 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
1ca90 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1caa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cab0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
1cac0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1cad0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
1cae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1caf0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1cb00 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
1cb10 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1cb20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cb30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1cb40 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1cb50 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1cb60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1cb70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1cb80 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1cb90 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
1cba0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
1cbb0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
1cbc0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
1cbd0 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
1cbe0 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
1cbf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1cc00 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
1cc10 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1cc20 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
1cc30 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1cc40 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
1cc50 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1cc60 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a      if( rc<0 ){.
1cc70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cc80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1cc90 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
1cca0 20 69 66 28 20 72 63 3d 3d 31 20 7c 7c 20 69 73   if( rc==1 || is
1ccb0 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Hot ){.        /
1ccc0 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
1ccd0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1cce0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
1ccf0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
1cd00 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  s.        ** imp
1cd10 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
1cd20 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
1cd30 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
1cd40 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
1cd50 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
1cd60 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
1cd70 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
1cd80 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
1cd90 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
1cda0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
1cdb0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
1cdc0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
1cdd0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
1cde0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
1cdf0 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
1ce00 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
1ce10 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
1ce20 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
1ce30 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
1ce40 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
1ce50 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
1ce60 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
1ce70 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
1ce80 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
1ce90 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
1cea0 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
1ceb0 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
1cec0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
1ced0 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  fail to.        
1cee0 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  ** obtain its ow
1cef0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1cf00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1cf10 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1cf20 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1cf30 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
1cf40 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
1cf50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1cf60 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1cf70 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
1cf80 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
1cf90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cfa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1cfb0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1cfc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1cfd0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
1cfe0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1cff0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rc);.          }
1d000 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1d010 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1d020 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1d030 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 20 20      }. .        
1d040 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
1d050 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
1d060 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
1d070 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
1d080 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73         ** exclus
1d090 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1d0a0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1d0b0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
1d0c0 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
1d0d0 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
1d0e0 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
1d0f0 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
1d100 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
1d110 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
1d120 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
1d130 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
1d140 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
1d150 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
1d160 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77       ** a read/w
1d170 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  rite file handle
1d180 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d190 20 20 20 20 20 69 66 28 20 21 69 73 48 6f 74 20       if( !isHot 
1d1a0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1d1b0 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  alOpen==0 ){.   
1d1c0 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d         int res =
1d1d0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1d1e0 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
1d1f0 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
1d200 43 45 53 53 5f 45 58 49 53 54 53 29 3b 0a 20 20  CESS_EXISTS);.  
1d210 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d          if( res=
1d220 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
1d230 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
1d240 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1d250 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
1d260 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1d270 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1d280 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
1d290 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1d2a0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1d2b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d2c0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1d2d0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1d2e0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
1d2f0 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
1d300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d310 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1d320 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1d330 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20  ethods );.      
1d340 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53        if( fout&S
1d350 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1d360 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
1d370 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d380 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
1d390 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
1d3a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
1d3b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1d3c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
1d3d0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
1d3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d3f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
1d400 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74   not exist, that
1d410 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65   means some othe
1d420 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20  r process.      
1d430 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72        ** has alr
1d440 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62  eady rolled it b
1d450 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ack */.         
1d460 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1d470 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
1d480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d490 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 4f    /* If sqlite3O
1d4a0 73 41 63 63 65 73 73 28 29 20 72 65 74 75 72 6e  sAccess() return
1d4b0 73 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  s a negative val
1d4c0 75 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 69  ue, that means i
1d4d0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
1d4e0 20 66 61 69 6c 65 64 20 61 20 6d 65 6d 6f 72 79   failed a memory
1d4f0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
1d500 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1d510 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1d520 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
1d530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d560 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1d570 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1d580 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
1d590 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
1d5a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 0a 20 20  SQLITE_NOMEM:.  
1d5b0 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
1d5c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
1d5d0 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
1d5e0 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
1d5f0 52 5f 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20  R_NOMEM:.       
1d600 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ;.            de
1d620 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
1d630 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d640 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1d650 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d660 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d670 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
1d680 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d690 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
1d6a0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
1d6b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1d6c0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
1d6d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
1d6e0 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
1d6f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
1d700 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  0;. .        /* 
1d710 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
1d720 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1d730 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
1d740 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
1d750 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
1d760 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
1d770 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
1d780 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
1d790 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1d7a0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
1d7b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d7c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d7d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d7e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d7f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d800 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1d810 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1d820 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20  HARED || .      
1d830 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
1d840 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
1d850 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41  pPager->state>PA
1d860 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
1d870 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
1d880 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d890 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
1d8a0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
1d8b0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
1d8c0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
1d8d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d8e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
1d8f0 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64  there are alread
1d900 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  y pages in the c
1d910 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65  ache (from a pre
1d920 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a  vious.        **
1d930 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
1d940 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
1d950 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
1d960 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
1d970 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
1d980 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
1d990 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
1d9a0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
1d9b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68  .        ** cach
1d9c0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
1d9d0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
1d9e0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
1d9f0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
1da00 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
1da10 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  inning.        *
1da20 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
1da30 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
1da40 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
1da50 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
1da60 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32  .        ** a 32
1da70 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
1da80 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
1da90 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
1daa0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
1dab0 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
1dac0 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
1dad0 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
1dae0 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
1daf0 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
1db00 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20  in use..        
1db10 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ** .        ** T
1db20 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
1db30 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
1db40 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
1db50 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
1db60 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
1db70 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
1db80 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
1db90 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
1dba0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ll that.        
1dbb0 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
1dbc0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20  lected..        
1dbd0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
1dbe0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
1dbf0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1dc00 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20  Vers)];.        
1dc10 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1dc20 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a  count(pPager);..
1dc30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1dc40 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1dc50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dc60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1dc70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1dc80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1dc90 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
1dca0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1dcb0 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
1dcc0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
1dcd0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
1dce0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1dcf0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1dd00 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
1dd10 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1dd20 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
1dd30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1dd40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dd50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dd60 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1dd70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dd80 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
1dd90 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
1dda0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1ddb0 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
1ddc0 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d         if( memcm
1ddd0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
1dde0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1ddf0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1de00 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
1de10 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1de20 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1de30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1de40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1de50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1de60 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
1de70 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41  state<=PAGER_SHA
1de80 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
1de90 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1dea0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1deb0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1dec0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1ded0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1dee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1def0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67  ** Allocate a Pg
1df00 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69  Hdr object.   Ei
1df10 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e 65  ther create a ne
1df20 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a  w one or reuse.*
1df30 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  * an existing on
1df40 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74  e that is not ot
1df50 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a  herwise in use..
1df60 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64  **.** A new PgHd
1df70 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  r structure is c
1df80 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66  reated if any of
1df90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1dfa0 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a  re.** true:.**.*
1dfb0 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1dfc0 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20  ve not exceeded 
1dfd0 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  our maximum allo
1dfe0 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a 65  cated cache size
1dff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73 20  .**          as 
1e000 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41 47  set by the "PRAG
1e010 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63  MA cache_size" c
1e020 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1e030 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72 65    (2)  There are
1e040 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72   no unused PgHdr
1e050 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62   objects availab
1e060 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  le at this time.
1e070 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1e080 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  This is an in-me
1e090 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
1e0a0 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68  *.**     (4)  Th
1e0b0 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72  ere are no PgHdr
1e0c0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f   objects that do
1e0d0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a   not require a j
1e0e0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
1e0f0 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64     file sync and
1e100 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a   a sync of the j
1e110 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
1e120 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
1e130 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e       prohibited.
1e140 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1e150 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  , reuse an exist
1e160 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f  ing PgHdr.  In o
1e170 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73  ther words, reus
1e180 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  e an.** existing
1e190 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66   PgHdr if all of
1e1a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1e1b0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
1e1c0 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
1e1d0 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65 65  reached or excee
1e1e0 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ded the maximum 
1e1f0 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
1e200 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62         allowed b
1e210 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  y "PRAGMA cache_
1e220 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  size"..**.**    
1e230 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20 61   (2)  There is a
1e240 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65   PgHdr available
1e250 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65   with PgHdr->nRe
1e260 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  f==0.**.**     (
1e270 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69  3)  We are not i
1e280 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
1e290 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20  atabase.**.**   
1e2a0 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74 68    (4)  Either th
1e2b0 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61  ere is an availa
1e2c0 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20 64  ble PgHdr that d
1e2d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20  oes not need.** 
1e2e0 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20 73           to be s
1e2f0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72  ynced to disk or
1e300 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69   else disk synci
1e310 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ng is currently.
1e320 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
1e330 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  wed..*/.static i
1e340 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65  nt pagerAllocate
1e350 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1e360 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
1e370 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e380 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
1e390 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79   *pPg;.  int nBy
1e3a0 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20 43 72 65  teHdr;..  /* Cre
1e3b0 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72 20  ate a new PgHdr 
1e3c0 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
1e3d0 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65  ur conditions de
1e3e0 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76  fined .  ** abov
1e3f0 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20  e are met: */.  
1e400 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1e410 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
1e420 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c  .   || pPager->l
1e430 72 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20  ru.pFirst==0 .  
1e440 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20   || MEMDB.   || 
1e450 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
1e460 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20  rstSynced==0 && 
1e470 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1e480 63 29 0a 20 20 29 7b 0a 20 20 20 20 76 6f 69 64  c).  ){.    void
1e490 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28   *pData;.    if(
1e4a0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
1e4b0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
1e4c0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
1e4d0 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70  ize_hash_table(p
1e4e0 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
1e4f0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35  pPager->nHash<25
1e500 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72  6 ? 256 : pPager
1e510 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20  ->nHash*2);.    
1e520 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48    if( pPager->nH
1e530 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
1e540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1e550 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
1e560 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1e570 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1e580 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61    }.    pagerLea
1e590 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
1e5a0 6e 42 79 74 65 48 64 72 20 3d 20 73 69 7a 65 6f  nByteHdr = sizeo
1e5b0 66 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66  f(*pPg) + sizeof
1e5c0 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
1e5d0 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
1e5e0 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
1e5f0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 3b 0a  eof(PgHistory);.
1e600 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1e610 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48  3_malloc( nByteH
1e620 64 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  dr );.    if( pP
1e630 67 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  g ){.      pData
1e640 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e650 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
1e660 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
1e670 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20   pData==0 ){.   
1e680 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1e690 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1e6a0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  pPg = 0;.      }
1e6b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1e6c0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
1e6d0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
1e6e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e6f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1e700 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1e710 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
1e720 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
1e730 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20 20 20  , nByteHdr);.   
1e740 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20 70 44   pPg->pData = pD
1e750 61 74 61 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  ata;.    pPg->pP
1e760 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
1e770 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
1e780 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
1e790 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
1e7a0 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61  l = pPg;.    pPa
1e7b0 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
1e7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65  }else{.    /* Re
1e7d0 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e  cycle an existin
1e7e0 67 20 70 61 67 65 20 77 69 74 68 20 61 20 7a 65  g page with a ze
1e7f0 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f  ro ref-count. */
1e800 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1e810 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20  recycle(pPager, 
1e820 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1e830 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
1e840 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e850 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
1e860 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  D;.    }.    if(
1e870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e880 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1e890 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
1e8a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1e8b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e8c0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1e8d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29  .    assert(pPg)
1e8e0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20  ;.  }.  *ppPg = 
1e8f0 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f  pPg;..pager_allo
1e900 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75  cate_out:.  retu
1e910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e920 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
1e930 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  e the content fo
1e940 72 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68  r a page.  If th
1e950 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72  e page was.** pr
1e960 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
1e970 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
1e980 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ==1, then the co
1e990 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73  ntent was.** jus
1e9a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  t initialized to
1e9b0 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f   zeros instead o
1e9c0 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
1e9d0 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e  m disk..** But n
1e9e0 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65 20 72  ow we need the r
1e9f0 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20  eal data off of 
1ea00 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73  disk.  So make s
1ea10 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69  ure we.** have i
1ea20 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e 20 69  t.  Read it in i
1ea30 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  f we do not have
1ea40 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a   it already..*/.
1ea50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ea60 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48  _get_content(PgH
1ea70 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
1ea80 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b  pPg->needRead ){
1ea90 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65  .    int rc = re
1eaa0 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50  adDbPage(pPg->pP
1eab0 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e  ager, pPg, pPg->
1eac0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1ead0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eae0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52        pPg->needR
1eaf0 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ead = 0;.    }el
1eb00 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
1eb10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
1eb20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1eb30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
1eb40 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
1eb50 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
1eb60 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
1eb70 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
1eb80 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
1eb90 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
1eba0 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
1ebb0 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
1ebc0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
1ebd0 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
1ebe0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
1ebf0 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ks for any page 
1ec00 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
1ec10 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64  han 0.  If the d
1ec20 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1ec30 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1ec40 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
1ec50 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75  ge, then no actu
1ec60 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  al disk.** read 
1ec70 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d  occurs and the m
1ec80 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
1ec90 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  he page is initi
1eca0 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c  alized to.** all
1ecb0 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74   zeros.  The ext
1ecc0 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
1ecd0 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
1ece0 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
1ecf0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  .** to zeros the
1ed00 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
1ed10 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
1ed20 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  o memory..**.** 
1ed30 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
1ed40 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
1ed50 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
1ed60 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
1ed70 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
1ed80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ed90 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
1eda0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
1edb0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
1edc0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
1edd0 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
1ede0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
1edf0 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
1ee00 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
1ee10 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
1ee20 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
1ee30 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
1ee40 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
1ee50 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
1ee60 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
1ee70 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
1ee80 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
1ee90 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
1eea0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
1eeb0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
1eec0 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
1eed0 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
1eee0 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
1eef0 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
1ef00 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
1ef10 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
1ef20 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
1ef30 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
1ef40 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
1ef50 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
1ef60 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
1ef70 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
1ef80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
1ef90 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  tent is false, t
1efa0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
1efb0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65   are actually re
1efc0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
1efd0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
1efe0 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
1eff0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
1f000 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
1f010 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
1f020 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
1f030 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f  me, so do not do
1f040 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a   a disk read.  J
1f050 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a  ust fill in the.
1f060 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
1f070 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74  with zeros.  But
1f080 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20 74   mark the fact t
1f090 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hat we have not 
1f0a0 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  read the.** cont
1f0b0 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20 74  ent by setting t
1f0c0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
1f0d0 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f  d flag.  Later o
1f0e0 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65  n, if .** sqlite
1f0f0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1f100 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
1f110 70 61 67 65 20 6f 72 20 69 66 20 74 68 69 73 20  page or if this 
1f120 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61  routine is.** ca
1f130 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74 68 20  lled again with 
1f140 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68  noContent==0, th
1f150 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  at means that th
1f160 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65  e content is nee
1f170 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ded.** and the d
1f180 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20  isk read should 
1f190 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
1f1a0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
1f1b0 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 28  nt pagerAcquire(
1f1c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f1d0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1f1e0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
1f1f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f200 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
1f210 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1f220 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
1f230 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
1f240 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
1f250 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f260 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
1f270 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
1f280 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
1f290 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
1f2a0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
1f2b0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1f2c0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
1f2d0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1f2e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1f2f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
1f300 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c  pPager->nRef>0 |
1f310 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20  | pgno==1 );..  
1f320 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
1f330 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
1f340 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
1f350 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
1f360 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
1f370 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
1f380 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
1f390 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
1f3a0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
1f3b0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
1f3c0 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
1f3d0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1f3e0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
1f3f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1f400 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
1f410 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
1f420 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
1f430 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
1f440 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
1f450 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
1f460 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pPage = 0;..  /*
1f470 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1f480 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
1f490 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
1f4a0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
1f4b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f4c0 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
1f4d0 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
1f4e0 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
1f4f0 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
1f500 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
1f510 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
1f520 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
1f530 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1f540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1f550 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1f560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f570 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1f580 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70  CK );..  pPg = p
1f590 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1f5a0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
1f5b0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
1f5c0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1f5d0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
1f5e0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
1f5f0 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
1f600 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50      int h;.    P
1f610 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1f620 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63  ->nMiss);.    rc
1f630 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65   = pagerAllocate
1f640 50 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  Page(pPager, &pP
1f650 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1f660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f680 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67    }..    pPg->pg
1f690 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61  no = pgno;.    a
1f6a0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c  ssert( !MEMDB ||
1f6b0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74   pgno>pPager->st
1f6c0 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50  mtSize );.    pP
1f6d0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  g->inJournal = s
1f6e0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
1f6f0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
1f700 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  nal, pgno);.    
1f710 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1f720 30 3b 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61  0;..    makeClea
1f730 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
1f740 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20 20 20 20  >nRef = 1;..    
1f750 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
1f760 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f770 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
1f780 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1f790 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
1f7a0 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
1f7b0 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
1f7c0 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74      nMax = sqlit
1f7d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1f7e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1f7f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1f800 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1f810 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1f820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1f830 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1f840 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f850 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
1f860 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
1f870 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
1f880 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
1f890 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
1f8a0 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
1f8b0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
1f8c0 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
1f8d0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
1f8e0 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
1f8f0 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f   || MEMDB || (no
1f900 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
1f910 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1f920 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ck) ){.      if(
1f930 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
1f940 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
1f950 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1f960 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1f970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1f980 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
1f990 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
1f9a0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
1f9b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f9c0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  );.      pPg->ne
1f9d0 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65  edRead = noConte
1f9e0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  nt && !pPager->a
1f9f0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20  lwaysRollback;. 
1fa00 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
1fa10 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
1fa20 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1fa30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fa40 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1fa50 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
1fa60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fa70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1fa80 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
1fa90 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1faa0 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
1fab0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
1fac0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1fad0 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
1fae0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1faf0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
1fb00 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ad = 0;.    }.. 
1fb10 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70     /* Link the p
1fb20 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1fb30 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
1fb40 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28      h = pgno & (
1fb50 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
1fb60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
1fb70 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  no!=0 );.    pPg
1fb80 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
1fb90 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
1fba0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
1fbb0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
1fbc0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
1fbd0 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
1fbe0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
1fbf0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
1fc00 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
1fc10 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
1fc20 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
1fc30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1fc40 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1fc50 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
1fc60 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1fc70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
1fc80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1fc90 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
1fca0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1fcb0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  che. */.    asse
1fcc0 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  rt(pPager->nRef>
1fcd0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
1fce0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1fcf0 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
1fd00 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
1fd10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1fd20 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1fd30 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1fd40 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
1fd50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fd60 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
1fd70 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
1fd80 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
1fd90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fda0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1fdb0 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
1fdc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1fdd0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1fde0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
1fdf0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1fe00 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
1fe10 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1fe20 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
1fe30 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
1fe40 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
1fe50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1fe60 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
1fe70 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
1fe80 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1fe90 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
1fea0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
1feb0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
1fec0 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
1fed0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
1fee0 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 28 70  = pagerAcquire(p
1fef0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50  Pager, pgno, ppP
1ff00 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
1ff10 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
1ff20 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1ff30 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63  rc;.}.../*.** Ac
1ff40 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
1ff50 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
1ff60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1ff70 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
1ff80 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
1ff90 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
1ffa0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1ffb0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
1ffc0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1ffd0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
1ffe0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1fff0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
20000 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
20010 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
20020 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
20030 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
20040 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
20050 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
20060 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
20070 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
20080 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
20090 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
200a0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
200b0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
200c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
200d0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
200e0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
200f0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
20100 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
20110 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
20120 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
20130 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
20140 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
20150 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20160 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
20170 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
20180 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
20190 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
201a0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
201b0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  UNLOCK ){.    as
201c0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
201d0 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  All || pPager->e
201e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
201f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
20200 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
20210 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
20220 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
20230 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
20240 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
20250 28 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  (pPg = pager_loo
20260 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
20270 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61 67  ))!=0 ){.    pag
20280 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
20290 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
202a0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
202b0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
202c0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
202d0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
202e0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
202f0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
20300 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
20310 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
20320 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
20330 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
20340 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
20350 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
20360 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
20370 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
20380 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20390 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
203a0 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
203b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
203c0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
203d0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
203e0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
203f0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
20400 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
20410 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
20420 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
20430 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67  >nRef>0 );.  pag
20440 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61  erEnter(pPg->pPa
20450 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ger);.  pPg->nRe
20460 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  f--;..  CHECK_PA
20470 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
20480 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
20490 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
204a0 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
204b0 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
204c0 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
204d0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
204e0 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
204f0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
20500 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69  =0 ){..    lruLi
20510 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20  stAdd(pPg);.    
20520 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
20530 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
20540 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
20550 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
20560 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20570 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
20580 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
20590 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
205a0 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
205b0 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
205c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
205d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
205e0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
205f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20600 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
20610 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
20620 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
20630 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
20640 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20650 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
20660 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
20670 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
20680 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
20690 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
206a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
206b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
206c0 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
206d0 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
206e0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
206f0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
20700 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
20710 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
20720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
20730 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
20740 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
20750 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20760 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
20770 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
20780 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
20790 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
207a0 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
207b0 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
207c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
207d0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
207e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
207f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20800 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
20810 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
20820 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
20830 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
20840 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
20850 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
20860 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
20870 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
20880 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20890 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
208a0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
208b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
208c0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
208d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
208e0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
208f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
20900 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
20910 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
20920 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
20930 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
20940 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
20950 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
20960 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
20970 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
20980 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
20990 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
209a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
209b0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
209c0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
209d0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
209e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
209f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
20a00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
20a10 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
20a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
20a30 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
20a40 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
20a50 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  AL);.    }else{.
20a60 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
20a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
20a80 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
20a90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20aa0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
20ab0 54 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  TE.    rc = sqli
20ac0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
20ad0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
20ae0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20af0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
20b00 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
20b10 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  ze(pPager).    )
20b20 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
20b30 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
20b40 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
20b50 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
20b60 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
20b70 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
20b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20b90 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
20ba0 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
20bb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20bc0 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
20bd0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
20be0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
20bf0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
20c00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
20c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
20c30 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  EM ){.        sq
20c40 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
20c50 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
20c60 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
20c70 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  }.      goto fai
20c80 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
20c90 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nal;.    }.  }. 
20ca0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20cb0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
20cc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
20cd0 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
20ce0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
20cf0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
20d00 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
20d10 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
20d20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
20d30 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
20d40 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
20d50 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
20d60 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20d70 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
20d80 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
20d90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20da0 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
20db0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
20dc0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
20dd0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
20de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20df0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20e00 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
20e10 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
20e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20e30 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
20e40 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
20e50 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
20e60 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
20e70 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
20e80 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
20e90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ea0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
20eb0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
20ec0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20ed0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
20ee0 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
20ef0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
20f00 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
20f10 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
20f20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
20f30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20f40 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
20f50 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
20f60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
20f70 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
20f80 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
20f90 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
20fa0 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
20fb0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
20fc0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
20fd0 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  o() is called..*
20fe0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
20ff0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73  gerRollback() is
21000 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
21010 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
21020 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
21030 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
21040 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20 63  agerUnref() is c
21050 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
21060 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
21070 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
21080 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
21090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
210a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
210b0 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
210c0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
210d0 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
210e0 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
210f0 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
21100 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61  d merely to.** a
21110 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
21120 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
21130 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
21140 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20  roof that there 
21150 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20  is.** already a 
21160 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
21170 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
21180 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
21190 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
211a0 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
211b0 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72  n bytes to reser
211c0 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74  ve for a.** mast
211d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  er journal file-
211e0 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72  name at the star
211f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
21200 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61   when it is crea
21210 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ted..**.** A jou
21220 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
21230 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
21240 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
21250 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72  ile.  For tempor
21260 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68  ary.** files, th
21270 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
21280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
21290 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
212a0 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61  there is an.** a
212b0 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
212c0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
212d0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
212e0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
212f0 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f  eady reserved fo
21300 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20  r writing, this 
21310 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
21320 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46  op..**.** If exF
21330 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20  lag is true, go 
21340 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e  ahead and get an
21350 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
21360 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  on the file.** i
21370 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65  mmediately inste
21380 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e  ad of waiting un
21390 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c  til we try to fl
213a0 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
213b0 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73  The.** exFlag is
213c0 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72   ignored if a tr
213d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
213e0 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  eady active..*/.
213f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21400 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50  Begin(DbPage *pP
21410 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  g, int exFlag){.
21420 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21430 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
21440 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21450 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  _OK;.  pagerEnte
21460 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  r(pPager);.  ass
21470 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
21480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21490 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
214a0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
214b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
214c0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
214d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
214e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
214f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d  ==0 );.    if( M
21500 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
21510 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
21520 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
21530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
21540 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
21550 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
21560 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21570 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
21580 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
21590 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
215a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
215b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
215c0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
215d0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
215e0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
215f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21600 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
21610 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
21620 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
21630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21660 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
21670 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
21680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21690 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
216a0 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
216b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
216c0 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
216d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
216e0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66  ager));.      if
216f0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
21700 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
21710 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20  >tempFile.      
21720 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
21730 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
21740 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21750 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20  _OFF ){.        
21760 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
21770 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
21780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21790 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
217a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
217b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
217c0 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
217d0 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
217e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
217f0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
21800 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a  ccess mode last.
21810 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72      ** time a (r
21820 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72  ead or write) tr
21830 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75  ansaction was su
21840 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c  ccessfully concl
21850 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  uded.    ** by t
21860 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
21870 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74  Instead of delet
21880 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
21890 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20  file it was .   
218a0 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   ** kept open an
218b0 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  d truncated to 0
218c0 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   bytes..    */. 
218d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
218e0 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
218f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21900 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
21910 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21920 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
21930 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  l==0 );.    sqli
21940 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
21950 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
21960 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
21970 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
21980 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
21990 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
219a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
219b0 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65  );.    pagerEnte
219c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
219d0 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  f( !pPager->pInJ
219e0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
219f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
21a00 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
21a10 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
21a20 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
21a30 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
21a40 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
21a50 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
21a60 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
21a70 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
21a80 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
21a90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
21aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21ab0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
21ac0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21ad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
21ae0 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
21af0 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
21b00 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
21b10 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
21b20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
21b30 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
21b40 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
21b50 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
21b60 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
21b70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
21b80 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
21b90 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
21ba0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
21bb0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
21bc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
21bd0 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
21be0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
21bf0 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
21c00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
21c10 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
21c20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
21c30 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
21c40 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
21c50 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
21c60 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
21c70 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
21c80 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
21c90 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
21ca0 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
21cb0 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
21cc0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
21cd0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
21ce0 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
21cf0 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
21d00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
21d10 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
21d20 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
21d30 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
21d40 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
21d50 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
21d60 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
21d70 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
21d80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
21d90 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
21da0 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
21db0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
21dc0 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  ty->pDirty = pPg
21dd0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
21de0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21df0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
21e00 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
21e10 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
21e20 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
21e30 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
21e40 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
21e50 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
21e60 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
21e70 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
21e80 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
21e90 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
21ea0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
21eb0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
21ec0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
21ed0 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
21ee0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
21ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
21f00 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
21f10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
21f20 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
21f30 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
21f40 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
21f50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
21f60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
21f70 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
21f80 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
21f90 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
21fa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
21fb0 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
21fc0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
21fd0 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
21fe0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
21ff0 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
22000 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
22010 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
22020 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
22030 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
22040 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
22050 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
22060 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
22070 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
22080 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
22090 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
220a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
220b0 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
220c0 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
220d0 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
220e0 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
220f0 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
22100 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
22110 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
22120 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
22130 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
22140 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
22150 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
22160 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
22170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22180 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
22190 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
221a0 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
221b0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
221c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
221d0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
221e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
221f0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
22200 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
22210 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22220 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
22230 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
22240 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
22250 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
22260 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22270 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
22280 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
22290 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
222a0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
222b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
222c0 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
222d0 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
222e0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
222f0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
22300 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
22310 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
22320 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
22330 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
22340 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
22350 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
22360 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
22370 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
22380 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
22390 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
223a0 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
223b0 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
223c0 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
223d0 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
223e0 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
223f0 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
22400 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
22410 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
22420 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
22430 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
22440 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
22450 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
22460 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
22470 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
22480 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22490 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
224a0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
224b0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
224c0 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
224d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
224e0 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
224f0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
22500 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
22510 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
22520 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
22530 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
22540 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53  rnal && (pageInS
22550 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
22560 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
22570 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
22580 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
22590 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
225a0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
225b0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
225c0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
225d0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
225e0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
225f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22600 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
22610 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
22620 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
22630 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22640 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
22650 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
22660 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
22670 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
22680 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
22690 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
226a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
226b0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
226c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
226d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
226e0 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
226f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22720 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
22730 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
22740 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
22750 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
22760 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
22770 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
22780 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  l.          && p
22790 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
227a0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
227b0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
227c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
227d0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
227e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
227f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
22810 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22820 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
22830 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
22840 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
22850 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
22860 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
22870 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
22880 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22890 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
228a0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
228b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
228c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
228d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
228e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
228f0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
22900 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
22910 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
22920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22930 65 6e 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  en || MEMDB) ){.
22940 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
22950 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
22960 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
22970 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  {.        if( ME
22980 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
22990 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
229a0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
229b0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
229c0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
229d0 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
229e0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
229f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22a00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
22a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
22a20 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
22a30 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
22a40 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33  >pOrig = sqlite3
22a50 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  _malloc( pPager-
22a60 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
22a70 20 20 20 20 20 20 20 69 66 28 20 21 70 48 69 73         if( !pHis
22a80 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
22a90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22aa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22ac0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
22ad0 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
22ae0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
22af0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
22b00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22b10 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
22b20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  m;.          cha
22b30 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
22b40 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
22b50 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
22b60 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
22b70 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
22b80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
22b90 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
22ba0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
22bb0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
22bc0 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
22bd0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
22be0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
22bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
22c00 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
22c10 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
22c20 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
22c30 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
22c40 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
22c50 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
22c60 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
22c70 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
22c80 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
22c90 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
22ca0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
22cb0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
22cc0 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
22cd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
22ce0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
22d00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
22d10 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
22d20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
22d30 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
22d60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
22d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
22d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22d90 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
22da0 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
22db0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
22dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22de0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
22df0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
22e00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22e10 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
22e20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
22e30 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
22e40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22e50 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
22e60 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
22e70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
22e80 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
22ea0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
22eb0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22ec0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  e));.          P
22ed0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
22ee0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
22ef0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ount);.         
22f00 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a 4f   PAGERTRACE5("JO
22f10 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
22f20 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
22f30 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
22f40 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
22f50 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22f60 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
22f70 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67 65  Sync, pager_page
22f80 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20 20  hash(pPg));..   
22f90 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
22fa0 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
22fb0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
22fc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
22fd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
22fe0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
22ff0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
23000 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
23010 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
23020 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
23030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23040 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23050 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
23060 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
23070 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
23080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23090 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
230a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
230b0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
230c0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
230d0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
230e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
230f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
23100 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
23110 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
23120 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
23130 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23140 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
23150 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
23160 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
23170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23180 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23190 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
231a0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
231b0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
231c0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
231d0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
231e0 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
231f0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
23200 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
23210 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
23220 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
23230 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
23240 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
23250 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
23260 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
23270 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
23280 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
23290 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
232a0 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
232b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
232c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
232d0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
232e0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
232f0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
23300 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
23310 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
23320 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
23330 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
23340 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
23350 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
23360 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
23370 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
23380 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
23390 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
233a0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
233b0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
233c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
233d0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
233e0 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53       && !pageInS
233f0 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20  tatement(pPg) . 
23400 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d      && (int)pPg-
23410 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
23420 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a  tmtSize .    ){.
23430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23440 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
23450 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
23460 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
23470 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
23480 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
23490 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
234a0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
234b0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
234c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
234d0 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
234e0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
234f0 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33  >pStmt = sqlite3
23500 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  _malloc( pPager-
23510 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
23520 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
23530 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
23540 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
23550 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
23560 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
23570 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
23580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23590 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
235a0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
235b0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
235c0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
235d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  pgno);.        p
235e0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
235f0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
23600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23610 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61  i64 offset = pPa
23620 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34  ger->stmtNRec*(4
23630 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
23640 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  e);.        char
23650 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43   *pData2 = CODEC
23660 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
23670 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
23680 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
23690 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
236a0 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >stfd, offset, p
236b0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
236c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
236d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
236e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
236f0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
23700 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
23710 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
23720 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 20  fset+4);.       
23730 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
23740 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
23750 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
23760 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
23770 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
23780 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
23790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
237a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
237b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
237c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
237d0 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  tNRec++;.       
237e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
237f0 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >pInStmt!=0 );. 
23800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
23810 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
23820 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
23830 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
23840 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
23850 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
23860 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
23870 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23880 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
23890 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
238a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
238b0 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
238c0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
238d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
238e0 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21  >pgno;.    if( !
238f0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
23900 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
23910 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
23920 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
23930 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
23940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23950 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23960 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23970 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20  is used to mark 
23980 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77  a data-page as w
23990 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73  ritable. It uses
239a0 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65   .** pager_write
239b0 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75  () to open a jou
239c0 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74  rnal file (if it
239d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
239e0 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69  open).** and wri
239f0 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61  te the page *pDa
23a00 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ta to the journa
23a10 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  l..**.** The dif
23a20 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
23a30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
23a40 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
23a50 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
23a60 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
23a70 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
23a80 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
23a90 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
23aa0 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
23ab0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
23ac0 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
23ad0 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
23ae0 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
23af0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
23b00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23b10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
23b20 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
23b30 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
23b40 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
23b50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23b60 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
23b70 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
23b80 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
23b90 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
23ba0 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
23bb0 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
23bc0 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
23bd0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61  pageSize);..  pa
23be0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
23bf0 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ;.  if( !MEMDB &
23c00 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
23c10 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
23c20 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
23c30 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
23c40 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
23c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
23c60 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c80 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
23c90 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
23ca0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
23cb0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23cd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
23ce0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
23cf0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
23d00 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
23d10 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
23d20 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
23d30 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
23d40 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
23d50 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
23d60 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
23d70 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
23d80 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
23d90 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
23da0 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
23db0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
23dc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
23dd0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
23de0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
23df0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
23e00 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
23e10 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
23e20 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
23e30 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
23e40 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
23e50 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
23e60 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
23e70 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
23e80 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
23e90 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
23ea0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
23eb0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
23ec0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
23ed0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
23ee0 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
23ef0 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
23f00 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
23f10 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  nt = sqlite3Page
23f20 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
23f30 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  r);.    if( pPg-
23f40 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
23f50 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
23f60 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
23f70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
23f80 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
23f90 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
23fa0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
23fb0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
23fc0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
23fd0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
23fe0 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
23ff0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
24000 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
24010 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
24020 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
24030 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
24040 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
24050 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
24060 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
24070 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
24080 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
24090 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
240a0 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
240b0 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
240c0 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
240d0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
240e0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
240f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
24100 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
24110 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
24120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24130 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
24140 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
24150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
24160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24170 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
24180 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
24190 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
241a0 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  if( pPage->needS
241b0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
241c0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
241d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
241e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
241f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
24200 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24210 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
24230 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
24240 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
24250 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
24260 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e  ( pPage->needSyn
24270 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  c ){.          n
24280 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
242a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
242b0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
242c0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  nc flag is set f
242d0 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
242e0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
242f0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
24300 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
24310 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
24320 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
24330 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
24340 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
24350 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
24360 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
24370 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
24380 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
24390 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
243a0 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
243b0 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
243c0 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
243d0 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
243e0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
243f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
24400 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
24410 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66 6f  Sync ){.      fo
24420 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
24430 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69   && needSync; ii
24440 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
24450 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
24460 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
24470 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
24480 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70 50    if( pPage ) pP
24490 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  age->needSync = 
244a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
244b0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
244c0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
244d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
244e0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
244f0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
24500 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
24510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24520 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
24530 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  DbPage);.  }.  p
24540 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
24550 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24560 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24570 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
24580 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
24590 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
245a0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
245b0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
245c0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
245d0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
245e0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
245f0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
24600 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
24610 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
24620 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
24630 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
24640 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
24650 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
24660 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66  >dirty;.}.#endif
24670 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
24680 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
24690 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
246a0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
246b0 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
246c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
246d0 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
246e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
246f0 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72  lite3PagerOverwr
24700 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
24710 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
24720 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
24730 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
24740 72 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  rc;..  pagerEnte
24750 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
24760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
24770 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
24780 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d  &pPg);.  if( rc=
24790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
247a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
247b0 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
247c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
247d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
247e0 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65  mcpy(sqlite3Page
247f0 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70  rGetData(pPg), p
24800 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
24810 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
24820 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24830 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  nref(pPg);.  }. 
24840 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
24850 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
24860 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24870 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
24880 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
24890 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
248a0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
248b0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
248c0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
248d0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
248e0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
248f0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
24900 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
24910 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
24920 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
24930 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
24940 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
24950 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
24960 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
24970 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
24980 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
24990 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
249a0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
249b0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
249c0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
249d0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
249e0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
249f0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
24a00 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
24a10 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
24a20 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
24a30 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
24a40 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
24a50 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
24a60 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
24a70 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
24a80 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
24a90 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
24aa0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
24ab0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
24ac0 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
24ad0 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
24ae0 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
24af0 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
24b00 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
24b10 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
24b20 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
24b30 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
24b40 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
24b50 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
24b60 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
24b70 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
24b80 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
24b90 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
24ba0 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
24bb0 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
24bc0 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
24bd0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
24be0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
24bf0 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
24c00 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
24c10 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
24c20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
24c30 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
24c40 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
24c50 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
24c60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24c70 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
24c80 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
24c90 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
24ca0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
24cb0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
24cc0 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
24cd0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
24ce0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
24cf0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
24d00 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
24d10 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
24d20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
24d30 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
24d40 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
24d50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24d60 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
24d70 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
24d80 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
24d90 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
24da0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
24db0 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
24dc0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61  B ) return;.  pa
24dd0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
24de0 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
24df0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
24e00 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
24e10 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
24e20 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
24e30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
24e40 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
24e50 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
24e60 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
24e70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
24e80 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
24e90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
24ea0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
24eb0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
24ec0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
24ed0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
24ee0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
24ef0 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
24f00 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
24f10 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
24f20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
24f30 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
24f40 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
24f50 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
24f60 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
24f70 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
24f80 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
24f90 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
24fa0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
24fb0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
24fc0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
24fd0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
24fe0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
24ff0 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
25000 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
25010 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
25020 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
25030 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
25040 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
25050 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
25060 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
25070 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
25080 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
25090 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
250a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
250b0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
250c0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
250d0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
250e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
250f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
25100 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
25110 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
25120 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b  pgno)).      mak
25130 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66  eClean(pPg);.#if
25140 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
25150 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
25160 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
25170 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
25180 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
25190 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
251a0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
251b0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
251c0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
251d0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
251e0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
251f0 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
25200 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
25210 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
25220 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
25230 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
25240 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
25250 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
25260 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
25270 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
25280 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
25290 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
252a0 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
252b0 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
252c0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
252d0 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
252e0 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
252f0 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
25300 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
25310 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
25320 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
25330 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
25340 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
25350 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
25360 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
25370 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
25380 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
25390 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
253a0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
253b0 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
253c0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
253d0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
253e0 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ger;..  pagerEnt
253f0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  er(pPager);.  as
25400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25410 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
25420 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
25430 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25440 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
25450 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25460 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a   been called on.
25470 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28    ** this page (
25480 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73  DontWrite() sets
25490 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
254a0 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20  ack flag), then 
254b0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
254c0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
254d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
254e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
254f0 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73 52   || pPg->alwaysR
25500 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
25510 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
25520 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c 65  k ){.    pagerLe
25530 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
25540 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
25550 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
25560 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d      /* For a mem
25570 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  db, pPager->jour
25580 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79  nalOpen is alway
25590 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 0 */..#ifdef S
255a0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
255b0 45 54 45 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  ETE.  if( pPg->i
255c0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
255d0 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20 70 50 61  )pPg->pgno > pPa
255e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
255f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
25600 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25610 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  If SECURE_DELETE
25620 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
25630 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  en there is no w
25640 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  ay that this.  *
25650 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  * routine can be
25660 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
25670 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69  e for which sqli
25680 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
25690 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e().  ** has not
256a0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
256b0 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74   called during t
256c0 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
256d0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66  ion..  ** And if
256e0 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
256f0 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e   previously been
25700 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c   called, the fol
25710 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64  lowing.  ** cond
25720 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
25730 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
25740 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  t( !pPg->inJourn
25750 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
25760 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
25770 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20  origDbSize );.. 
25780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25790 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
257a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
257b0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
257c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
257d0 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f  no);.  pPg->inJo
257e0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67  urnal = 1;.  pPg
257f0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
25800 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
25810 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
25820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
25830 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  tmtSize >= pPage
25840 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
25850 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
25860 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
25870 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
25880 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  );.  }.  PAGERTR
25890 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
258a0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
258b0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
258c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
258d0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
258e0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
258f0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
25900 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76  no)).  pagerLeav
25910 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  e(pPager);.}.../
25920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25930 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
25940 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
25950 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
25960 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
25970 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
25980 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
25990 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
259a0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
259b0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
259c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
259d0 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
259e0 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
259f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
25a00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25a10 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  _OK;..  if( !pPa
25a20 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
25a30 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
25a40 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
25a50 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
25a60 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
25a70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
25a80 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
25a90 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
25aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
25ab0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
25ac0 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
25ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25ae0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
25af0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
25b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
25b20 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
25b30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25b40 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
25b50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
25b60 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
25b70 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
25b80 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
25b90 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
25ba0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
25bb0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
25bc0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
25bd0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
25be0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
25bf0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
25c00 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
25c10 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
25c20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
25c30 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
25c40 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
25c50 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
25c60 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
25c70 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
25c80 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
25c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25ca0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
25cb0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
25cc0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
25cd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
25ce0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
25cf0 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
25d00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25d10 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
25d20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
25d30 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
25d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25d50 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
25d60 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
25d70 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
25d80 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
25d90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
25da0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
25db0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
25dc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
25dd0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
25de0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
25df0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
25e00 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
25e10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
25e20 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
25e30 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
25e40 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
25e50 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
25e60 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
25e70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
25e80 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
25e90 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
25ea0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
25eb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
25ec0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
25ed0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
25ee0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
25ef0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
25f00 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
25f10 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
25f20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
25f30 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
25f40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
25f50 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
25f60 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
25f70 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
25f80 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
25f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
25fa0 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
25fb0 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
25fc0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
25fd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
25fe0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
25ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
26000 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
26010 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
26020 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
26030 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
26040 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
26050 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
26060 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
26070 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
26080 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
26090 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
260a0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
260b0 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
260c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
260d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
260e0 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
260f0 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
26100 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
26110 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
26120 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  abases)..**.** I
26130 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
26140 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
26150 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
26160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26170 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
26180 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
26190 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
261a0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
261b0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
261c0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
261d0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
261e0 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
261f0 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
26200 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
26210 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
26220 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
26230 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26240 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
26250 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
26260 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
26270 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a  .  Pgno nTrunc,.
26280 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
26290 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
262a0 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52  E_OK;..  PAGERTR
262b0 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
262c0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
262d0 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
262e0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
262f0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
26300 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
26310 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
26320 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66  Pager);..  /* If
26330 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
26340 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
26350 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
26360 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
26370 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
26380 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
26390 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
263a0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
263b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
263c0 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
263d0 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
263e0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
263f0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
26400 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
26410 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
26420 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
26430 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
26440 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
26450 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
26460 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
26470 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
26480 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
26490 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
264a0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
264b0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
264c0 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
264d0 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
264e0 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
264f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
26500 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
26510 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
26520 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
26530 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
26540 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
26550 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
26560 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
26570 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
26580 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
26590 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
265a0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
265b0 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
265c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
265d0 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
265e0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
265f0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
26600 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
26610 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20  seAtomicWrite = 
26620 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74  (.        !zMast
26630 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
26640 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
26650 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  f==jrnlBufferSiz
26660 65 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20  e(pPager) && .  
26670 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20        nTrunc==0 
26680 26 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d  && .        (0==
26690 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c  pPager->pDirty |
266a0 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69  | 0==pPager->pDi
266b0 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  rty->pDirty).   
266c0 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41   );.    if( useA
266d0 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20  tomicWrite ){.  
266e0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
266f0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
26700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26710 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  . */.      int o
26720 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
26730 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
26740 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26750 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  c);.      assert
26760 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31  (pPager->nRec==1
26770 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
26780 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
26790 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  ->jfd, offset, p
267a0 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
267b0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
267c0 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
267d0 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66  e counter. The f
267e0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
267f0 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20  ll modify.      
26800 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ** the in-memory
26810 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
26820 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63  of page 1 to inc
26830 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
26840 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  .      ** change
26850 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
26860 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64  n write page 1 d
26870 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
26880 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
26890 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
268a0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
268b0 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  te property of t
268c0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
268d0 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74  tem, .      ** t
268e0 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
268f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
26900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
26920 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
26930 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
26940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26950 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
26960 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
26970 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
26980 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
26990 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69  f( !useAtomicWri
269a0 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  te && rc==SQLITE
269b0 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20  _OK ).#endif..  
269c0 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
269d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
269e0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
269f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
26a00 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
26a10 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
26a20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
26a30 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
26a40 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
26a50 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
26a60 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
26a70 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
26a80 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
26a90 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
26aa0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
26ab0 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
26ac0 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
26ad0 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
26ae0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
26af0 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
26b00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
26b10 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
26b20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
26b30 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
26b40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
26b50 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
26b60 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
26b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26b80 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
26b90 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
26ba0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26bb0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
26bc0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
26bd0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
26be0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
26bf0 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
26c00 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
26c10 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
26c20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
26c30 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
26c40 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
26c50 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
26c60 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
26c70 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
26c80 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
26c90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b  .        int iSk
26ca0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
26cb0 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
26cc0 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
26cd0 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
26ce0 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
26cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26d00 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
26d10 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
26d20 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
26d30 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
26d40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26d50 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
26d60 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
26d70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
26d90 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
26da0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26db0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26dc0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
26dd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
26de0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
26df0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26e00 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
26e10 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
26e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
26e30 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
26e40 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
26e50 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
26e60 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
26e70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26e80 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
26e90 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
26ea0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
26eb0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
26ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26ed0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26ee0 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
26ef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26f00 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26f10 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
26f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26f30 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
26f40 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
26f50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26f60 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26f70 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
26f80 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
26f90 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
26fa0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
26fb0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
26fc0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
26fd0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
26fe0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
26ff0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
27000 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
27010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27020 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
27030 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
27040 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
27050 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
27060 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
27070 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
27080 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
27090 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
270a0 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
270b0 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
270c0 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
270d0 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
270e0 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
270f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
27100 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
27110 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
27120 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
27130 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
27140 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
27150 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
27160 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
27170 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
27180 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
27190 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
271a0 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
271b0 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
271c0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
271d0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
271e0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  xit;.    }.    p
271f0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
27200 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
27210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27220 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
27230 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
27240 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
27250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27260 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
27270 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
27280 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
27290 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
272a0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
272b0 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
272c0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
272d0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
272e0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
272f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
27300 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
27310 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
27320 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
27330 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
27340 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
27350 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
27360 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
27370 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
27380 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
27390 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
273a0 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
273b0 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
273c0 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
273d0 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
273e0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
273f0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
27400 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
27410 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20  ent, it is.     
27420 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
27430 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
27440 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d       */.    rc =
27450 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
27460 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
27470 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
27480 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
27490 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
274a0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
274b0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
274c0 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
274d0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
274e0 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
274f0 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
27500 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
27510 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
27520 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27530 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
27540 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
27550 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
27560 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
27570 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
27580 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
27590 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
275a0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
275b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
275c0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
275d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
275e0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
275f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
27600 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
27610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27620 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
27630 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
27640 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
27650 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
27660 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27670 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
27680 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
27690 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
276a0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
276b0 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
276c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
276d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
276e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
276f0 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72  er);.      clear
27700 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
27710 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
27720 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
27730 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
27740 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
27750 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
27760 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
27770 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
27780 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
27790 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
277a0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
277b0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
277c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
277d0 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
277e0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
277f0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
27800 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
27810 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
27820 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
27830 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
27840 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
27850 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
27860 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
27870 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
27880 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
27890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
278a0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
278b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
278c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
278d0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
278e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
278f0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67  _SHARED;.    pag
27900 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
27910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27920 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
27930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27940 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
27950 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
27960 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
27970 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
27980 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
27990 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72  .  rc = pager_er
279a0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
279b0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
279c0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
279d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
279e0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
279f0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
27a00 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
27a10 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
27a20 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
27a30 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
27a40 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
27a50 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
27a60 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
27a70 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
27a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27a90 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
27aa0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
27ab0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
27ac0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
27ad0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
27ae0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75  ng protocol or u
27af0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
27b00 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
27b10 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
27b20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
27b30 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
27b40 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
27b50 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
27b60 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
27b70 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
27b80 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
27b90 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
27ba0 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
27bb0 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
27bc0 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
27bd0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
27be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27bf0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
27c00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
27c10 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52  nt rc;.  PAGERTR
27c20 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
27c30 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27c40 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
27c50 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
27c60 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
27c70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
27c80 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
27c90 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
27ca0 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
27cb0 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
27cc0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
27cd0 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
27ce0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
27cf0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
27d00 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
27d10 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
27d20 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
27d30 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
27d40 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
27d50 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
27d60 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
27d70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27d80 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
27d90 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
27da0 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
27db0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
27dc0 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
27dd0 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
27de0 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
27df0 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
27e00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
27e10 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c  PAGERTRACE3("ROL
27e20 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
27e30 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
27e40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27e50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27e60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
27e70 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20  CE3("PAGE %d is 
27e80 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20  clean on %d\n", 
27e90 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
27ea0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
27eb0 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69   }.      clearHi
27ec0 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
27ed0 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30      p->dirty = 0
27ee0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75  ;.      p->inJou
27ef0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
27f00 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
27f10 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
27f20 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
27f30 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
27f40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
27f50 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
27f60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
27f70 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50  >xReiniter(p, pP
27f80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
27f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27fa0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
27fb0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
27fc0 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
27fd0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
27fe0 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
27ff0 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72  bSize;.    pager
28000 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
28010 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
28020 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
28030 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
28040 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
28050 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
28060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28070 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28080 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50  ager);.  if( !pP
28090 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
280a0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
280b0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
280c0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
280d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
280e0 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  r);.    pagerLea
280f0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
28100 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
28110 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
28120 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
28130 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
28140 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
28150 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
28160 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
28170 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
28180 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
28190 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  0);.    }.    pa
281a0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
281b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  ;.    return pPa
281c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
281d0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
281e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
281f0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
28200 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
28210 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
28220 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63  ager, 0);.    rc
28230 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
28240 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
28250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
28260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28270 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
28280 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
28290 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
282a0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
282b0 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65   }.  /* pager_re
282c0 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  set(pPager); */.
282d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
282e0 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   = -1;..  /* If 
282f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28300 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
28310 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
28320 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
28330 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20  ger.  ** cache. 
28340 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
28350 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
28360 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
28370 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72   error .  ** per
28380 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
28390 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
283a0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
283b0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
283c0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
283d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
283e0 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
283f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
28400 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
28410 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
28420 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
28430 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
28440 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
28450 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
28460 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
28470 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28480 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
28490 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
284a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
284b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
284c0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
284d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
284e0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
284f0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
28500 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a  Pager->nRef;.}..
28510 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
28520 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
28530 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
28540 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
28550 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
28560 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
28570 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
28580 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
28590 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
285a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
285b0 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
285c0 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
285d0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
285e0 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
285f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
28600 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
28610 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
28620 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
28630 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
28640 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
28650 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
28660 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
28670 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
28680 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
28690 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
286a0 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
286b0 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
286c0 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
286d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
286e0 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
286f0 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
28700 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
28710 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
28720 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
28730 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
28740 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
28750 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
28760 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
28770 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
28780 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
28790 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
287a0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
287b0 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
287c0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
287d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
287e0 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
287f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
28800 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
28810 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
28820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28830 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
28840 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
28850 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
28860 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47  Size>=0 );.  PAG
28870 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42  ERTRACE2("STMT-B
28880 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
28890 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
288a0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
288b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
288c0 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
288d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
288e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
288f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28900 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
28910 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28920 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
28930 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
28940 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
28950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
28960 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28970 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
28980 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28990 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
289a0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
289b0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
289c0 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  pInStmt = sqlite
289d0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
289e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
289f0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
28a00 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
28a10 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->pInStmt==0 ){
28a20 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
28a30 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
28a40 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
28a50 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
28a60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
28a70 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
28a80 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
28a90 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
28aa0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
28ab0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
28ac0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
28ad0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
28ae0 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
28af0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
28b00 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
28b10 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
28b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28b30 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
28b40 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
28b50 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  >stfd, pPager->z
28b60 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20  StmtJrnl,.      
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
28b90 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
28ba0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
28bb0 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62       goto stmt_b
28bc0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
28bd0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
28be0 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
28bf0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
28c00 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
28c10 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
28c20 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
28c30 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
28c40 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
28c50 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
28c60 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
28c70 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
28c80 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
28c90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
28ca0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
28cb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
28cc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
28cd0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
28ce0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
28cf0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28d00 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
28d10 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
28d20 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
28d30 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
28d40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28d50 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
28d60 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
28d70 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
28d80 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
28d90 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r){.  pagerEnter
28da0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28db0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28dc0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
28dd0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
28de0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
28df0 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
28e00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28e10 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
28e20 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  B ){.      /* sq
28e30 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
28e40 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
28e50 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
28e60 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
28e70 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
28e80 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
28e90 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
28ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
28eb0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
28ec0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
28ed0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
28ee0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
28ef0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
28f00 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
28f10 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
28f20 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
28f30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28f40 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
28f50 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
28f60 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
28f70 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
28f80 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
28f90 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
28fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28fb0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
28fc0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
28fd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28fe0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
28ff0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
29000 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
29010 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
29020 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
29030 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
29040 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
29050 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
29060 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
29070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29080 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
29090 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
290a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
290b0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
290c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
290d0 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
290e0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
290f0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
29100 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
29110 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
29120 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
29130 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
29140 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
29150 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
29160 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
29170 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
29180 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
29190 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
291a0 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
291b0 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
291c0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
291d0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
291e0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
291f0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
29200 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
29210 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
29220 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
29230 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
29240 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
29250 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
29260 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
29270 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
29280 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
29290 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
292a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
292b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
292c0 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
292d0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
292e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
292f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
29300 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
29310 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
29320 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
29330 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
29340 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
29350 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
29360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29370 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
29380 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
29390 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
293a0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
293b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
293c0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
293d0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
293e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
293f0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
29400 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
29410 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
29420 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
29430 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
29440 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
29450 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
29460 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
29470 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
29480 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
29490 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
294a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
294b0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
294c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
294d0 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
294e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
294f0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
29500 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
29510 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
29520 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
29530 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
29540 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
29550 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
29560 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
29570 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
29580 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
29590 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
295a0 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
295b0 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
295c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
295d0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
295e0 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
295f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29600 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
29610 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
29620 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
29630 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
29640 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29650 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
29660 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
29670 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
29680 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
29690 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
296a0 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
296b0 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
296c0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
296d0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
296e0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
296f0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
29700 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
29710 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
29720 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
29730 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
29740 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
29750 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
29760 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
29770 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
29780 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
29790 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
297a0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
297b0 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
297c0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
297d0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
297e0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
297f0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
29800 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
29810 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
29820 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
29830 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
29840 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
29850 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29860 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
29870 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
29880 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
29890 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
298a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
298b0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
298c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
298d0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
298e0 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
298f0 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
29900 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
29910 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
29920 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
29930 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
29940 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61  ge previous loca
29950 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
29960 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
29970 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
29980 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
29990 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
299a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
299b0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
299c0 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
299d0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
299e0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
299f0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
29a00 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
29a10 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
29a20 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
29a30 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
29a40 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
29a50 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
29a60 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
29a70 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
29a80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
29a90 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
29aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29ab0 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
29ac0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
29ad0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
29ae0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
29af0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
29b00 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
29b10 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
29b20 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
29b30 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
29b40 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
29b50 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
29b60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
29b70 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
29b80 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
29b90 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
29ba0 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
29bb0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
29bc0 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a  Hdr *pPgOld;  /*
29bd0 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
29be0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
29bf0 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
29c00 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
29c10 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
29c20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
29c30 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
29c40 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  ;..  PAGERTRACE5
29c50 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
29c60 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
29c70 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
29c80 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
29c90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
29ca0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
29cb0 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
29cc0 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
29cd0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29ce0 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
29cf0 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
29d00 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
29d10 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
29d20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
29d30 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
29d40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
29d50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
29d60 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
29d70 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
29d80 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
29d90 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
29da0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
29db0 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
29dc0 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
29dd0 6f 6d 20 69 74 73 20 68 61 73 68 2d 63 68 61 69  om its hash-chai
29de0 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
29df0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
29e00 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
29e10 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
29e20 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
29e30 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
29e40 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
29e50 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
29e60 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
29e70 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
29e80 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
29e90 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
29ea0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
29eb0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
29ec0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
29ed0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
29ee0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
29ef0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64    */.  pPg->need
29f00 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f  Sync = 0;.  pPgO
29f10 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
29f20 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
29f30 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
29f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
29f50 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
29f60 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
29f70 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
29f80 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
29f90 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
29fa0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
29fb0 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
29fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29fd0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
29fe0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a  ;.  }.  pPg->inJ
29ff0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2a000 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2a010 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
2a020 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e  gno);..  /* Chan
2a030 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
2a040 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
2a050 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
2a060 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
2a070 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2a080 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
2a090 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
2a0a0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
2a0b0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
2a0c0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
2a0d0 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
2a0e0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
2a0f0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
2a100 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
2a110 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
2a120 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
2a130 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
2a140 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
2a150 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
2a160 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
2a170 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
2a180 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
2a190 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
2a1a0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
2a1b0 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
2a1c0 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
2a1d0 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
2a1e0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2a1f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2a200 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
2a210 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
2a220 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
2a230 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
2a240 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
2a250 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
2a260 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
2a270 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
2a280 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
2a290 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
2a2a0 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70 49  .    ** Pager.pI
2a2b0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
2a2c0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
2a2d0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
2a2e0 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
2a2f0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
2a300 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
2a310 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
2a320 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2a330 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
2a340 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
2a350 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
2a360 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
2a370 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
2a380 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
2a390 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
2a3a0 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
2a3b0 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
2a3c0 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
2a3d0 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
2a3e0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
2a3f0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
2a400 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
2a410 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
2a420 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
2a430 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
2a440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a450 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
2a460 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
2a470 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2a480 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
2a490 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
2a4a0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
2a4b0 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
2a4c0 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
2a4d0 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
2a4e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
2a4f0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
2a500 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
2a510 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
2a520 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
2a530 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
2a540 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
2a550 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
2a560 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
2a570 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
2a580 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a590 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
2a5a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a5b0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2a5c0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
2a5d0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
2a5e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a5f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
2a600 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
2a610 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50  & (int)needSyncP
2a620 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
2a630 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
2a640 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2a650 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
2a660 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
2a670 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
2a680 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76  .      pagerLeav
2a690 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2a6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a6b0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
2a6c0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2a6d0 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63  pPgHdr->needSync
2a6e0 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
2a6f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
2a700 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70  .    makeDirty(p
2a710 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
2a720 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2a730 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61  gHdr);.  }..  pa
2a740 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
2a750 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a760 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
2a770 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2a780 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
2a790 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
2a7a0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2a7b0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2a7c0 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
2a7d0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
2a7e0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
2a7f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2a800 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2a810 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
2a820 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
2a830 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
2a840 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
2a850 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2a860 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
2a870 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2a880 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
2a890 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a8a0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a8b0 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
2a8c0 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
2a8d0 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
2a8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
2a8f0 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
2a900 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
2a910 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
2a920 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
2a930 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
2a940 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
2a950 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a960 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
2a970 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a980 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
2a990 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
2a9a0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
2a9b0 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
2a9c0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
2a9d0 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
2a9e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2a9f0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
2aa00 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
2aa10 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
2aa20 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
2aa30 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2aa40 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
2aa50 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
2aa60 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
2aa70 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
2aa80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2aa90 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
2aaa0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
2aab0 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
2aac0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
2aad0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2aaf0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
2ab00 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
2ab10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2ab20 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2ab30 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2ab40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2ab50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2ab60 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
2ab70 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2ab80 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
2ab90 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
2aba0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
2abb0 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
2abc0 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
2abd0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
2abe0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2abf0 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
2ac00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
2ac10 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
2ac20 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
2ac30 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
2ac40 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
2ac50 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
2ac60 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
2ac70 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
2ac80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
2ac90 55 45 52 59 2c 20 50 41 47 45 52 5f 4a 4f 55 52  UERY, PAGER_JOUR
2aca0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f  NALMODE_DELETE o
2acb0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  r .** PAGER_JOUR
2acc0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
2acd0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
2ace0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
2acf0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75   then.** the jou
2ad00 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74  rnal-mode is set
2ad10 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
2ad20 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
2ad30 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
2ad40 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
2ad50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
2ad60 4c 45 54 45 20 6f 72 0a 2a 2a 20 50 41 47 45 52  LETE or.** PAGER
2ad70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2ad80 53 49 53 54 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIST, indicating
2ad90 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
2ada0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
2adb0 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  ** journal-mode.
2adc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2add0 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  agerJournalMode(
2ade0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2adf0 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
2ae00 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
2ae10 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
2ae20 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
2ae30 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
2ae40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
2ae50 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  TE.            |
2ae60 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
2ae70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2ae80 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ST.            |
2ae90 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
2aea0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2aeb0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2aec0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
2aed0 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
2aee0 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
2aef0 4d 4f 44 45 5f 44 45 4c 45 54 45 3e 3d 30 20 26  MODE_DELETE>=0 &
2af00 26 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  & PAGER_JOURNALM
2af10 4f 44 45 5f 50 45 52 53 49 53 54 3e 3d 30 20 29  ODE_PERSIST>=0 )
2af20 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
2af30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2af40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d  journalMode = eM
2af50 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
2af60 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
2af70 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 23  ournalMode;.}..#
2af80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2af90 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  T./*.** Print a 
2afa0 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
2afb0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
2afc0 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
2afd0 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
2afe0 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70  ite3PagerRefdump
2aff0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2b000 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
2b010 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
2b020 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
2b030 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
2b040 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
2b050 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
2b060 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
2b070 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
2b080 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
2b090 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
2b0a0 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
2b0b0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
2b0c0 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
2b0d0 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
2b0e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
2b0f0 4b 49 4f 20 2a 2f 0a                             KIO */.