/ Hex Artifact Content
Login

Artifact 5599fb3ebb63a60ecb44a18a594b371484a7e128:


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 35  : pager.c,v 1.45
0350: 37 20 32 30 30 38 2f 30 36 2f 31 35 20 30 32 3a  7 2008/06/15 02:
0360: 35 31 3a 34 38 20 64 72 68 20 45 78 70 20 24 0a  51:48 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20  u8 dbModified;  
4000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4010: 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65  rue if there are
4020: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20   any changes to 
4030: 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 63  the Db */.  u8 c
4040: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
4050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
4060: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
4070: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
4080: 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 76 66  nter */.  u32 vf
4090: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
40a0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
40b0: 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  or sqlite3_vfs.x
40c0: 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Open() */.  int 
40d0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
40e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
40f0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
4100: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
4110: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
4120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4130: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4140: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
4150: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4170: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4180: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
4190: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
41c0: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
41d0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
41e0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
4210: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
4220: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
4230: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
4250: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
4260: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
4270: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
4280: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
42a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
42b0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
42c0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
42d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
42e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
42f0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
4300: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
4310: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
4320: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4340: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
4350: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
4380: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
4390: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
43a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
43c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
43d0: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
43e0: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
43f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
4400: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
4410: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
4420: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
4430: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
4440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4450: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
4460: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
4470: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 42 69  database */.  Bi
4480: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
4490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
44a0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
44b0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
44c0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 42 69 74  se file */.  Bit
44d0: 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b 20 20 20  vec *pInStmt;   
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
44f0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
4500: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
4510: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4520: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4530: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4540: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4550: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4560: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4570: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
45a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
45b0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
45c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
45d0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
45f0: 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46  , *jfd;     /* F
4600: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4610: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
4620: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
4630: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64  lite3_file *stfd
4640: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
4650: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4660: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
4670: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
4680: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
4690: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
46a0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
46b0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
46c0: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c 72 75  PagerLruList lru
46d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
46e0: 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  RU list of free 
46f0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
4700: 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20   *pAll;         
4710: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4720: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
4730: 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20   PgHdr *pStmt;  
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4750: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
4760: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
4770: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50  ubjournal */.  P
4780: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
47a0: 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20  st of all dirty 
47b0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a  pages */.  i64 j
47c0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
47d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
47e0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e  t byte offset in
47f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4800: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
4810: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
4820: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4830: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
4840: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
4850: 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66    i64 stmtHdrOff
4860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4870: 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   First journal h
4880: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68  eader written th
4890: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
48a0: 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b    i64 stmtCksum;
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
48c0: 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20   cksumInit when 
48d0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
48e0: 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73  arted */.  i64 s
48f0: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
4900: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4910: 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d  f journal at stm
4920: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
4930: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
4940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
4950: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
4960: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
4970: 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  k */.#ifdef SQLI
4980: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48  TE_TEST.  int nH
4990: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
49a0: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68        /* Cache h
49b0: 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20  its and missing 
49c0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20  */.  int nRead, 
49d0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
49e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
49f0: 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  es read/written 
4a00: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64  */.#endif.  void
4a10: 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28   (*xDestructor)(
4a20: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a  DbPage*,int); /*
4a30: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
4a40: 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20  ne when freeing 
4a50: 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  pages */.  void 
4a60: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
4a70: 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  age*,int);   /* 
4a80: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
4a90: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
4aa0: 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66   pages */.#ifdef
4ab0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4ac0: 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  C.  void *(*xCod
4ad0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
4ae0: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
4af0: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
4b00: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
4b10: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4b30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
4b40: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e   xCodec() */.#en
4b50: 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b  dif.  int nHash;
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
4b80: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4b90: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61  e */.  PgHdr **a
4ba0: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
4bb0: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
4bc0: 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d   to map page num
4bd0: 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a  ber to PgHdr */.
4be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4bf0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
4c00: 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a  GEMENT.  Pager *
4c10: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
4c20: 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20 6c       /* Doubly l
4c30: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
4c40: 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20 2a 2f  gers on which */
4c50: 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65 76 3b  .  Pager *pPrev;
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c70: 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  * sqlite3_releas
4c80: 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c 20  e_memory() will 
4c90: 77 6f 72 6b 20 2a 2f 0a 20 20 76 6f 6c 61 74 69  work */.  volati
4ca0: 6c 65 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d 3b  le int iInUseMM;
4cb0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
4cc0: 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62 6c 65  o if unavailable
4cd0: 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 76 6f 6c 61   to MM */.  vola
4ce0: 74 69 6c 65 20 69 6e 74 20 69 49 6e 55 73 65 44  tile int iInUseD
4cf0: 42 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a  B;      /* Non-z
4d00: 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69 74 65  ero if in sqlite
4d10: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
4d20: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  () */.#endif.  c
4d30: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
4d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
4d50: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
4d60: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
4d70: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61  tmp use */.  cha
4d80: 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d  r dbFileVers[16]
4d90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ;        /* Chan
4da0: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
4db0: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
4dc0: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
4dd0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
4de0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
4df0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
4e00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
4e10: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
4e20: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
4e30: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
4e40: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
4e50: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4e60: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4e70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4e80: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4e90: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4ea0: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4eb0: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4ec0: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4ed0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4ee0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4ef0: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4f00: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4f10: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4f20: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4f30: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4f40: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4f50: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4f60: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4f70: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4f80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4f90: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4fa0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4fb0: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4fc0: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4fd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4fe0: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d  r_pgfree_count =
4ff0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
5000: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
5010: 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e  freed */.# defin
5020: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20  e PAGER_INCR(v) 
5030: 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   v++.#else.# def
5040: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
5050: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
5060: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
5070: 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  riable points to
5080: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64   the head of a d
5090: 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73  ouble-linked lis
50a0: 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65  t.** of all page
50b0: 72 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67  rs that are elig
50c0: 69 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74  ible for page st
50d0: 65 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a  ealing by the.**
50e0: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
50f0: 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66  _memory() interf
5100: 61 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20  ace.  Access to 
5110: 74 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20  this list is.** 
5120: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
5130: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54   SQLITE_MUTEX_ST
5140: 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e  ATIC_MEM2 mutex.
5150: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5160: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
5170: 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69  MANAGEMENT.stati
5180: 63 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33  c Pager *sqlite3
5190: 50 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73  PagerList = 0;.s
51a0: 74 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69  tatic PagerLruLi
51b0: 73 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67  st sqlite3LruPag
51c0: 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30  eList = {0, 0, 0
51d0: 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  };.#endif.../*.*
51e0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
51f0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
5200: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
5210: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
5220: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
5230: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
5240: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
5250: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
5260: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
5270: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
5280: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
5290: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
52a0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
52b0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
52c0: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
52d0: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
52e0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
52f0: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
5300: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
5310: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
5320: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
5330: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
5340: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
5350: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
5360: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
5370: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
5380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
5390: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
53a0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
53b0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
53c0: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
53d0: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
53e0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
53f0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
5400: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
5410: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
5420: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
5430: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
5440: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
5450: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
5460: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
5470: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
5480: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
5490: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
54a0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
54b0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
54c0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
54d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
54e0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
54f0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
5500: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
5510: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
5520: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
5530: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
5540: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
5550: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
5560: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
5570: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
5580: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
5590: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
55a0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
55b0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
55c0: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
55d0: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
55e0: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
55f0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
5600: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
5610: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
5620: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
5630: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
5640: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
5650: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
5660: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
5670: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
5680: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
5690: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
56a0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
56b0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
56c0: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
56d0: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
56e0: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
56f0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
5700: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
5710: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
5720: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
5730: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
5740: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
5750: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
5760: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
5770: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
5780: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
5790: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
57a0: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
57b0: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
57c0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
57d0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
57e0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
57f0: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
5800: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5810: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
5820: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
5830: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
5840: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
5850: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
5860: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
5870: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
5880: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
5890: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
58a0: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
58b0: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
58c0: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
58d0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
58e0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
58f0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
5900: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
5910: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
5920: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
5930: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
5940: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
5950: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
5960: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
5970: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
5980: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
5990: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
59a0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
59b0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
59c0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
59d0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
59e0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
59f0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
5a00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
5a10: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
5a20: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
5a30: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
5a40: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
5a50: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
5a60: 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  .** Page number 
5a70: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73  PAGER_MJ_PGNO is
5a80: 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61   never used in a
5a90: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
5aa0: 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65  e (it is.** rese
5ab0: 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67  rved for working
5ac0: 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77   around a window
5ad0: 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74  s/posix incompat
5ae0: 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a  ibility). It is.
5af0: 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a  ** used in the j
5b00: 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66  ournal to signif
5b10: 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69  y that the remai
5b20: 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  nder of the jour
5b30: 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20  nal file .** is 
5b40: 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69  devoted to stori
5b50: 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
5b60: 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65  nal name - there
5b70: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67   are no more pag
5b80: 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61  es to.** roll ba
5b90: 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ck. See comments
5ba0: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72   for function wr
5bb0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
5bc0: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
5bd0: 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41  */./* #define PA
5be0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5bf0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
5c00: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f  )->pageSize)) */
5c10: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
5c20: 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44  J_PGNO(x) ((PEND
5c30: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
5c40: 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a  ageSize))+1)../*
5c50: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
5c60: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
5c70: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
5c80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
5c90: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
5ca0: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
5cb0: 20 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e   pagerEnter() an
5cc0: 64 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72  d pagerLeave() r
5cd0: 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20  outines acquire 
5ce0: 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61  and release.** a
5cf0: 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70   mutex on each p
5d00: 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78  ager.  The mutex
5d10: 20 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a   is recursive..*
5d20: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73  *.** This is a s
5d30: 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d  pecial-purpose m
5d40: 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70  utex.  It only p
5d50: 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65  rovides mutual e
5d60: 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77  xclusion.** betw
5d70: 65 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e  een the Btree an
5d80: 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e  d the Memory Man
5d90: 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f  agement sqlite3_
5da0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
5db0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  .** function.  I
5dc0: 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65  t does not preve
5dd0: 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  nt, for example,
5de0: 20 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d   two Btrees from
5df0: 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68   accessing.** th
5e00: 65 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20  e same pager at 
5e10: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
5e20: 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75  Other general-pu
5e30: 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e  rpose mutexes in
5e40: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
5e50: 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20  yer handle that 
5e60: 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  chore..*/.#ifdef
5e70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
5e80: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
5e90: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
5ea0: 61 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20  agerEnter(Pager 
5eb0: 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55  *p){.    p->iInU
5ec0: 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20  seDB++;.    if( 
5ed0: 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70  p->iInUseMM && p
5ee0: 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b  ->iInUseDB==1 ){
5ef0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5f00: 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 20  MUTEX_NOOP.     
5f10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
5f20: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 6d 75 74  mutex;.      mut
5f30: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
5f40: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
5f50: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5f60: 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  2);.#endif.     
5f70: 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30   p->iInUseDB = 0
5f80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5f90: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
5fa0: 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e  x);.      p->iIn
5fb0: 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20  UseDB = 1;.     
5fc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5fd0: 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20  eave(mutex);.   
5fe0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
5ff0: 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b  ->iInUseMM==0 );
6000: 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f  .  }.  static vo
6010: 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50 61  id pagerLeave(Pa
6020: 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e  ger *p){.    p->
6030: 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20  iInUseDB--;.    
6040: 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73  assert( p->iInUs
6050: 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  eDB>=0 );.  }.#e
6060: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
6070: 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66  erEnter(X).# def
6080: 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28 58  ine pagerLeave(X
6090: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
60a0: 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f 20  Add page pPg to 
60b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
60c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67  inked list manag
60d0: 65 64 20 62 79 20 73 74 72 75 63 74 75 72 65 0a  ed by structure.
60e0: 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62 65  ** pList (pPg be
60f0: 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65  comes the last e
6100: 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74  ntry in the list
6110: 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65   - the most rece
6120: 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20  ntly .** used). 
6130: 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73  Argument pLink s
6140: 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65  hould point to e
6150: 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20  ither pPg->free 
6160: 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a  or pPg->gfree,.*
6170: 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  * depending on w
6180: 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65  hether pPg is be
6190: 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
61a0: 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20   pager-specific 
61b0: 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55  or.** global LRU
61c0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
61d0: 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61   void listAdd(Pa
61e0: 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73  gerLruList *pLis
61f0: 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  t, PagerLruLink 
6200: 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70  *pLink, PgHdr *p
6210: 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e  Pg){.  pLink->pN
6220: 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b  ext = 0;.  pLink
6230: 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d  ->pPrev = pList-
6240: 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20  >pLast;..#ifdef 
6250: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
6260: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
6270: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
6280: 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c  &pPg->free || pL
6290: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65  ink==&pPg->gfree
62a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  );.  assert(pLin
62b0: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c  k==&pPg->gfree |
62c0: 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65  | pList!=&sqlite
62d0: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23  3LruPageList);.#
62e0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69  endif..  if( pLi
62f0: 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20  st->pLast ){.   
6300: 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61   int iOff = (cha
6310: 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61  r *)pLink - (cha
6320: 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67  r *)pPg;.    Pag
6330: 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74  erLruLink *pLast
6340: 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75  Link = (PagerLru
6350: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
6360: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f  pList->pLast)[iO
6370: 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c  ff]);.    pLastL
6380: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67  ink->pNext = pPg
6390: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
63a0: 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46  ssert(!pList->pF
63b0: 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  irst);.    pList
63c0: 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
63d0: 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c    }..  pList->pL
63e0: 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28  ast = pPg;.  if(
63f0: 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53   !pList->pFirstS
6400: 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65  ynced && pPg->ne
6410: 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20  edSync==0 ){.   
6420: 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79   pList->pFirstSy
6430: 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  nced = pPg;.  }.
6440: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
6450: 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  pPg from the lis
6460: 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65  t managed by the
6470: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
6480: 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a  ed to by pList..
6490: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
64a0: 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e  Link should poin
64b0: 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d  t to either pPg-
64c0: 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66  >free or pPg->gf
64d0: 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a  ree, depending .
64e0: 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50  ** on whether pP
64f0: 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64  g is being added
6500: 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70   to the pager-sp
6510: 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c  ecific or global
6520: 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   LRU list..*/.st
6530: 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65  atic void listRe
6540: 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73  move(PagerLruLis
6550: 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c  t *pList, PagerL
6560: 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50  ruLink *pLink, P
6570: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
6580: 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a  t iOff = (char *
6590: 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a  )pLink - (char *
65a0: 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51  )pPg;..#ifdef SQ
65b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
65c0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
65d0: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
65e0: 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e  Pg->free || pLin
65f0: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b  k==&pPg->gfree);
6600: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
6610: 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20  =&pPg->gfree || 
6620: 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c  pList!=&sqlite3L
6630: 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e  ruPageList);.#en
6640: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d  dif..  if( pPg==
6650: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b  pList->pFirst ){
6660: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72  .    pList->pFir
6670: 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  st = pLink->pNex
6680: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
6690: 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29  ==pList->pLast )
66a0: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61  {.    pList->pLa
66b0: 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65  st = pLink->pPre
66c0: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  v;.  }.  if( pLi
66d0: 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  nk->pPrev ){.   
66e0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
66f0: 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65  PrevLink = (Page
6700: 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75  rLruLink *)(&((u
6710: 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  8 *)pLink->pPrev
6720: 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50  )[iOff]);.    pP
6730: 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d  revLink->pNext =
6740: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLink->pNext;. 
6750: 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e   }.  if( pLink->
6760: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67  pNext ){.    Pag
6770: 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74  erLruLink *pNext
6780: 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75  Link = (PagerLru
6790: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
67a0: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f  pLink->pNext)[iO
67b0: 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c  ff]);.    pNextL
67c0: 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69  ink->pPrev = pLi
67d0: 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20  nk->pPrev;.  }. 
67e0: 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d   if( pPg==pList-
67f0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
6800: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
6810: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLink->pNext;.  
6820: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
6830: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
6840: 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20     PagerLruLink 
6850: 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  *pL = (PagerLruL
6860: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
6870: 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  )[iOff]);.      
6880: 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20  p = pL->pNext;. 
6890: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
68a0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
68b0: 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e  ;.  }..  pLink->
68c0: 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pNext = pLink->p
68d0: 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20  Prev = 0;.}../* 
68e0: 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50 67  .** Add page pPg
68f0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
6900: 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20 74  free pages for t
6910: 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a  he pager. If .**
6920: 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
6930: 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61  nt is enabled, a
6940: 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61 67 65  lso add the page
6950: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a   to the global .
6960: 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  ** list of free 
6970: 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
6980: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64   void lruListAdd
6990: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
69a0: 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50  listAdd(&pPg->pP
69b0: 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d  ager->lru, &pPg-
69c0: 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66  >free, pPg);.#if
69d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
69e0: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
69f0: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  ENT.  if( !pPg->
6a00: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6a20: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6a30: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6a40: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6a50: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74  _LRU));.    list
6a60: 41 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50  Add(&sqlite3LruP
6a70: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6a80: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20  free, pPg);.    
6a90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6aa0: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
6ab0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6ac0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6ad0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
6ae0: 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70  ./* .** Remove p
6af0: 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65  age pPg from the
6b00: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6b10: 67 65 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f  ges for the asso
6b20: 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a  ciated pager..**
6b30: 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   If memory-manag
6b40: 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
6b50: 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50  , also remove pP
6b60: 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61  g from the globa
6b70: 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65  l list.** of fre
6b80: 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  e pages..*/.stat
6b90: 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52  ic void lruListR
6ba0: 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67  emove(PgHdr *pPg
6bb0: 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28  ){.  listRemove(
6bc0: 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72  &pPg->pPager->lr
6bd0: 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70  u, &pPg->free, p
6be0: 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
6bf0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
6c00: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66  _MANAGEMENT.  if
6c10: 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  ( !pPg->pPager->
6c20: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
6c30: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6c40: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6c50: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6c60: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6c70: 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26      listRemove(&
6c80: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6c90: 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c  st, &pPg->gfree,
6ca0: 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74   pPg);.    sqlit
6cb0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
6cc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6cd0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6ce0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6cf0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a  }.#endif.}../* .
6d00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6d10: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
6d20: 61 66 74 65 72 20 74 68 65 20 6e 65 65 64 53 79  after the needSy
6d30: 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e  nc flag has been
6d40: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d   cleared.** from
6d50: 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67   all pages manag
6d60: 65 64 20 62 79 20 70 50 61 67 65 72 20 28 75 73  ed by pPager (us
6d70: 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68  ually because th
6d80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
6d90: 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
6da0: 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61  synced). It upda
6db0: 74 65 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e  tes the pPager->
6dc0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
6dd0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64   variable.** and
6de0: 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61  , if memory-mana
6df0: 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65  gement is enable
6e00: 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72  d, the sqlite3Lr
6e10: 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74  uPageList.pFirst
6e20: 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62  Synced.** variab
6e30: 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74  le also..*/.stat
6e40: 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53  ic void lruListS
6e50: 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 50 61  etFirstSynced(Pa
6e60: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
6e70: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6e80: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
6e90: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23  r->lru.pFirst;.#
6ea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6eb0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
6ec0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
6ed0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6ee0: 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
6ef0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6f00: 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ter(sqlite3_mute
6f10: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6f20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6f30: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  );.    for(p=sql
6f40: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
6f50: 70 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e  pFirst; p && p->
6f60: 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67  needSync; p=p->g
6f70: 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20  free.pNext);.   
6f80: 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65   assert(p==pPage
6f90: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
6fa0: 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65  ced || p==sqlite
6fb0: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
6fc0: 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20  rstSynced);.    
6fd0: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6fe0: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
6ff0: 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = p;.    sqlite3
7000: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
7010: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
7020: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
7030: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
7040: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
7050: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70  Return true if p
7060: 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72  age *pPg has alr
7070: 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
7080: 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  n to the stateme
7090: 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f  nt.** journal (o
70a0: 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70  r statement snap
70b0: 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72  shot has been cr
70c0: 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69  eated, if *pPg i
70d0: 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20  s part.** of an 
70e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
70f0: 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  se)..*/.static i
7100: 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65  nt pageInStateme
7110: 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
7120: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7130: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
7140: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
7150: 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
7160: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
7170: 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d  er)->inStmt;.  }
7180: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7190: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
71a0: 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  st(pPager->pInSt
71b0: 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
71c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
71d0: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
71e0: 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74  the pager hash t
71f0: 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75  able to N.  N mu
7200: 73 74 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a  st be a power.**
7210: 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74   of two..*/.stat
7220: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
7230: 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28  size_hash_table(
7240: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7250: 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a  nt N){.  PgHdr *
7260: 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20  *aHash, *pPg;.  
7270: 61 73 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28  assert( N>0 && (
7280: 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23  N&(N-1))==0 );.#
7290: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c  ifdef SQLITE_MAL
72a0: 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20  LOC_SOFT_LIMIT. 
72b0: 20 69 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48   if( N*sizeof(aH
72c0: 61 73 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d  ash[0])>SQLITE_M
72d0: 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54  ALLOC_SOFT_LIMIT
72e0: 20 29 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49   ){.    N = SQLI
72f0: 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c  TE_MALLOC_SOFT_L
7300: 49 4d 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73  IMIT/sizeof(aHas
7310: 68 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  h[0]);.  }.  if(
7320: 20 4e 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73   N==pPager->nHas
7330: 68 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64  h ) return;.#end
7340: 69 66 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  if.  pagerLeave(
7350: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
7360: 50 61 67 65 72 2d 3e 61 48 61 73 68 21 3d 30 20  Pager->aHash!=0 
7370: 29 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65  ) sqlite3FaultBe
7380: 67 69 6e 42 65 6e 69 67 6e 28 53 51 4c 49 54 45  ginBenign(SQLITE
7390: 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d  _FAULTINJECTOR_M
73a0: 41 4c 4c 4f 43 29 3b 0a 20 20 61 48 61 73 68 20  ALLOC);.  aHash 
73b0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
73c0: 65 72 6f 28 20 73 69 7a 65 6f 66 28 61 48 61 73  ero( sizeof(aHas
73d0: 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28  h[0])*N );.  if(
73e0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 21 3d   pPager->aHash!=
73f0: 30 20 29 20 73 71 6c 69 74 65 33 46 61 75 6c 74  0 ) sqlite3Fault
7400: 45 6e 64 42 65 6e 69 67 6e 28 53 51 4c 49 54 45  EndBenign(SQLITE
7410: 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d  _FAULTINJECTOR_M
7420: 41 4c 4c 4f 43 29 3b 0a 20 20 70 61 67 65 72 45  ALLOC);.  pagerE
7430: 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
7440: 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a  if( aHash==0 ){.
7450: 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74      /* Failure t
7460: 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20  o rehash is not 
7470: 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73  an error.  It is
7480: 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61   only a performa
7490: 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20  nce hit. */.    
74a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
74b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
74c0: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
74d0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
74e0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
74f0: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
7500: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7510: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
7520: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
7530: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
7540: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
7550: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7560: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
7570: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
7580: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
7590: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
75a0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
75b0: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
75c0: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
75d0: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
75e0: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
75f0: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
7600: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
7610: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
7620: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
7630: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
7640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
7650: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
7660: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
7670: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
7680: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
7690: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
76a0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
76b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
76c0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
76d0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
76e0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
76f0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
7700: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
7710: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
7720: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
7730: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
7740: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
7750: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
7760: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
7770: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
7780: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
7790: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
77a0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
77b0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
77c0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
77d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
77e0: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
77f0: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
7800: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7810: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
7820: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
7830: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
7840: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
7850: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
7860: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
7870: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
7880: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
7890: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
78a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
78b0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
78c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
78d0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
78e0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
78f0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
7900: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
7910: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
7920: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
7930: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
7940: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
7950: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
7960: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
7970: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
7980: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
7990: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
79a0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
79b0: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
79c0: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
79d0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
79e0: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
79f0: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
7a00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
7a10: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
7a20: 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64  f( !pFd->pMethod
7a30: 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
7a40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
7a50: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
7a60: 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f  sUnlock(pFd, eLo
7a70: 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ck);.}../*.** Th
7a80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
7a90: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
7aa0: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
7ab0: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
7ac0: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
7ad0: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
7ae0: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
7af0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
7b00: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
7b10: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7b20: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
7b30: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
7b40: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
7b50: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
7b60: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
7b70: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
7b80: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
7b90: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7ba0: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
7bb0: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
7bc0: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
7bd0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
7be0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
7bf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
7c00: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
7c10: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
7c20: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
7c30: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
7c40: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
7c50: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
7c60: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
7c70: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
7c80: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
7c90: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
7ca0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
7cb0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
7cc0: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
7cd0: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
7ce0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7cf0: 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20  .  int dc;      
7d00: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
7d10: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
7d20: 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b  /.  int nSector;
7d30: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
7d40: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  size */.  int nP
7d50: 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  age;        /* P
7d60: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71  age size */.  sq
7d70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
7d80: 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20   pPager->fd;..  
7d90: 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
7da0: 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   ){.    dc = sql
7db0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
7dc0: 61 63 74 65 72 69 73 74 69 63 73 28 66 64 29 3b  acteristics(fd);
7dd0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73  .    nSector = s
7de0: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
7df0: 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67  ze(fd);.    nPag
7e00: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
7e10: 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Size;.  }..  ass
7e20: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
7e30: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
7e40: 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28  >>8));.  assert(
7e50: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7e60: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
7e70: 38 29 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d  8));..  if( !fd-
7e80: 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63  >pMethods || (dc
7e90: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
7ea0: 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29  TOMIC|(nPage>>8)
7eb0: 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67  )&&nSector<=nPag
7ec0: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
7ed0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
7ee0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
7ef0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
7f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7f10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7f20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
7f30: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
7f40: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
7f50: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
7f60: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54  pager.** code. T
7f70: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
7f80: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
7f90: 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
7fa0: 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65  cture, the.** se
7fb0: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
7fc0: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
7fd0: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
7fe0: 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
7ff0: 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  . .** The value 
8000: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
8010: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
8020: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
8030: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
8040: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
8050: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
8060: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
8070: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
8080: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
8090: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
80a0: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
80b0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
80c0: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
80d0: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
80e0: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
80f0: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
8100: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
8110: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
8120: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
8130: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
8140: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
8150: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8160: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
8170: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
8180: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
8190: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
81a0: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
81b0: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
81c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
81d0: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
81e0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
81f0: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
8200: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
8210: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  t error occured,
8220: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
8230: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
8240: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
8250: 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  layed..*/.static
8260: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
8270: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
8280: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  );.static int pa
8290: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
82a0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
82b0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
82c0: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
82d0: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
82e0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
82f0: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
8300: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
8320: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
8330: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
8340: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
8350: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
8360: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
8370: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
8380: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
8390: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
83a0: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
83b0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
83c0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
83d0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
83e0: 4f 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  OCK && pPager->n
83f0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
8400: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8410: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
8420: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
8430: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
8440: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
8450: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
8460: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
8470: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
8480: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
8490: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
84a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
84b0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
84c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
84d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
84e0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
84f0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
8500: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
8510: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
8520: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
8530: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
8540: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
8550: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
8560: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
8570: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
8580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
8590: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
85a0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
85b0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
85c0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
85d0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
85e0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
85f0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
8600: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
8610: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
8620: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
8630: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
8640: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
8650: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
8660: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
8670: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
8680: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
8690: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
86a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
86b0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
86c0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
86d0: 7a 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ze, .           
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75 6e               (un
86f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
8700: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
8710: 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  e));.}../*.** Th
8720: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
8730: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
8740: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
8750: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
8760: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
8770: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
8780: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
8790: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
87a0: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
87b0: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
87c0: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
87d0: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
87e0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
87f0: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
8800: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
8810: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
8820: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
8830: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
8840: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
8850: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
8860: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
8870: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
8880: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
8890: 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e  | MEMDB || pPg->
88a0: 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20  dirty || .      
88b0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
88c0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
88d0: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
88e0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
88f0: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
8900: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
8910: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
8920: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
8930: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
8940: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
8950: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
8960: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
8970: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
8980: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
8990: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
89a0: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
89b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
89c0: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
89d0: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
89e0: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
89f0: 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a  caller. .**.** z
8a00: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
8a10: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
8a20: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
8a30: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
8a40: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
8a50: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
8a60: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
8a70: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
8a80: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
8a90: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
8aa0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
8ab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8ac0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
8ad0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
8ae0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
8af0: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
8b00: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
8b10: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
8b20: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
8b30: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
8b40: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
8b50: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
8b60: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
8b70: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
8b80: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74  **.** If no mast
8b90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8ba0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
8bb0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
8bc0: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
8bd0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
8be0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8bf0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
8c00: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
8c10: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
8c20: 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65  ster, int nMaste
8c30: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
8c40: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
8c50: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
8c60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
8c70: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
8c80: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
8c90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
8ca0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
8cb0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
8cc0: 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ';..  rc = sqlit
8cd0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
8ce0: 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  nl, &szJ);.  if(
8cf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
8d00: 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72  | szJ<16 ) retur
8d10: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
8d20: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
8d30: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20  szJ-16, &len);. 
8d40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8d50: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8d60: 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73  .  if( len>=nMas
8d70: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
8d80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8d90: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8da0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
8db0: 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  2, &cksum);.  if
8dc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8dd0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8de0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8df0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
8e00: 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69  , 8, szJ-8);.  i
8e10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8e20: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
8e30: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
8e40: 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63  , 8) ) return rc
8e50: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
8e60: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
8e70: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
8e80: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
8e90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8eb0: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
8ec0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a  n] = '\0';..  /*
8ed0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
8ee0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
8ef0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8f00: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
8f10: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
8f20: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
8f30: 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20  ster[i];.   }.  
8f40: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
8f50: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
8f60: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
8f70: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
8f80: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
8f90: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
8fa0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
8fb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8fc0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
8fd0: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
8fe0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
8ff0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
9000: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
9010: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
9020: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
9030: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
9040: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
9050: 20 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d      zMaster[0] =
9060: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
9070: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9080: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
9090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
90a0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
90b0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
90c0: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
90d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
90e0: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
90f0: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
9100: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
9110: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
9120: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
9130: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
9140: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
9150: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
9160: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
9170: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
9180: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91b0: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
91d0: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
91f0: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
9210: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
9230: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
9240: 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e  c void seekJourn
9250: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
9260: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
9270: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
9280: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9290: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
92a0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
92b0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
92c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
92d0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
92e0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
92f0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
9300: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9310: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
9320: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
9330: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
9340: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
9350: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
9360: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
9370: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
9380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
9390: 20 7a 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20   zeros over the 
93a0: 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
93b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
93c0: 73 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66  s has the.** eff
93d0: 65 63 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74  ect of invalidat
93e0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
93f0: 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74  file and committ
9400: 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  ing the.** trans
9410: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
9420: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
9430: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
9440: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
9450: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
9460: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61  SQLITE_OK;.  sta
9470: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
9480: 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20 20 69  eroHdr[28];..  i
9490: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
94a0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 69 36 34  alOff ){.    i64
94b0: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
94c0: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
94d0: 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52 41 43 45  it;..    IOTRACE
94e0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
94f0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
9500: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
9510: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
9520: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9530: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
9540: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
9550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
9560: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9570: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
9580: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
9590: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
95a0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
95b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
95c0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
95d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
95e0: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
95f0: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
9600: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
9610: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
9620: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9630: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
9640: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
9650: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
9660: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
9670: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
9680: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
9690: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
96a0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
96b0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
96c0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
96d0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
96e0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
96f0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
9700: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
9710: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
9720: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
9730: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
9740: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
9750: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
9760: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
9770: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
9780: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
9790: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
97a0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
97b0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
97c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
97d0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
97e0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
97f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9800: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
9810: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9820: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
9830: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
9840: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
9850: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9860: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
9870: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9880: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
9890: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
98a0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
98b0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
98c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
98d0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
98e0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
98f0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
9900: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
9910: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
9920: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
9930: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
9940: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
9950: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
9960: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
9970: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
9980: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
9990: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
99a0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
99b0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
99c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
99d0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
99e0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
99f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
9a00: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
9a10: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
9a20: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
9a30: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
9a40: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
9a50: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
9a60: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
9a70: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
9a80: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
9a90: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
9aa0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
9ab0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
9ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9ad0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
9ae0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9af0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9b00: 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48  E_OK;.  char *zH
9b10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
9b20: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 6e 74  pTmpSpace;.  int
9b30: 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
9b40: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
9b50: 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20 69 66  nt nWrite;..  if
9b60: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
9b70: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9b80: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
9b90: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9ba0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
9bb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
9bc0: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
9bd0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
9be0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
9bf0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
9c00: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
9c10: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
9c20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
9c30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c40: 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a  Off;..  memcpy(z
9c50: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
9c60: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
9c70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
9c80: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
9c90: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
9ca0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
9cb0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
9cc0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
9cd0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
9ce0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
9cf0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
9d00: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
9d10: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
9d20: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
9d30: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
9d40: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
9d50: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
9d60: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
9d70: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
9d80: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
9d90: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
9da0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
9db0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
9dc0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
9dd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
9de0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
9df0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
9e00: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
9e10: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
9e20: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
9e30: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
9e40: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
9e50: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
9e60: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
9e70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9e80: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
9e90: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
9ea0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
9eb0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
9ec0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
9ed0: 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
9ee0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
9ef0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
9f00: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
9f10: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
9f20: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
9f30: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
9f40: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
9f50: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
9f60: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
9f70: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
9f80: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
9f90: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
9fa0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
9fb0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
9fc0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
9fd0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
9fe0: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
9ff0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
a000: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
a010: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
a020: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
a030: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
a040: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
a050: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
a060: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
a070: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
a080: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
a090: 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28  noSync);.  if( (
a0a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
a0b0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
a0c0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
a0d0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
a0e0: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
a0f0: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
a100: 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  ){.    put32bits
a110: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
a120: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
a130: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
a140: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33   }else{.    put3
a150: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
a160: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
a170: 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  gic)], 0);.  }..
a180: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
a190: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
a1a0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
a1b0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
a1c0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
a1d0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
a1e0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
a1f0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
a200: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
a210: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
a220: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a230: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
a240: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
a250: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
a260: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
a270: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a280: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  8], pPager->dbSi
a290: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
a2a0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
a2b0: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
a2c0: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
a2d0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
a2e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
a2f0: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
a300: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28  ctorSize);.  if(
a310: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a320: 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Hdr==0 ){.    /*
a330: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
a340: 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  /.    put32bits(
a350: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
a360: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
a370: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
a380: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  Size);.  }..  fo
a390: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
a3a0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
a3b0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
a3c0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
a3d0: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
a3e0: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
a3f0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
a400: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
a410: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
a420: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
a430: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a440: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
a450: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
a460: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a470: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
a480: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
a490: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
a4a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
a4b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
a4c0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
a4d0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
a4e0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
a4f0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
a500: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
a510: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
a520: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a530: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
a540: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
a550: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
a560: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
a570: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
a580: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
a590: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
a5a0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
a5b0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
a5c0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
a5d0: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
a5e0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
a5f0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
a600: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
a610: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
a620: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
a630: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
a640: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
a650: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
a660: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
a670: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
a680: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
a690: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
a6a0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
a6b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
a6c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
a6d0: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
a6e0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
a6f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
a700: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
a710: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
a720: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
a730: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
a740: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
a750: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
a760: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
a770: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
a780: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
a790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a7a0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
a7b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
a7c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
a7d0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
a7e0: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
a7f0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
a800: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
a810: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
a820: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
a830: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
a840: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
a850: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
a860: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
a870: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e  64 jrnlOff;.  in
a880: 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  t iPageSize;..  
a890: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
a8a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
a8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a8c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
a8d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
a8e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
a8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a900: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
a910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a920: 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  Off;..  rc = sql
a930: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
a940: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
a950: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
a960: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
a970: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
a980: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a    jrnlOff += siz
a990: 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20  eof(aMagic);..  
a9a0: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
a9b0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
a9c0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
a9d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
a9e0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a9f0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
aa00: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
aa10: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52  fd, jrnlOff, pNR
aa20: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
aa30: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
aa40: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
aa50: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
aa60: 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63  ff+4, &pPager->c
aa70: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
aa80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
aa90: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
aaa0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
aab0: 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53   jrnlOff+8, pDbS
aac0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
aad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
aae0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
aaf0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
ab00: 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26  Off+16, (u32 *)&
ab10: 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  iPageSize);.  if
ab20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ab30: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
ab40: 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50 61  >=512 .   && iPa
ab50: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
ab60: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
ab70: 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d   && ((iPageSize-
ab80: 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30  1)&iPageSize)==0
ab90: 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70   .  ){.    u16 p
aba0: 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67 65 53  agesize = iPageS
abb0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
abc0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
abd0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70  esize(pPager, &p
abe0: 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  agesize);.  }.  
abf0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ac00: 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  rc;..  /* Update
ac10: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
ac20: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
ac30: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
ac40: 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72   by .  ** the pr
ac50: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
ac60: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
ac70: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
ac80: 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65   was.  ** create
ac90: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
aca0: 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
acb0: 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
acc0: 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65  utine.  ** is be
acd0: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
ace0: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
acf0: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
ad00: 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66  al value.  ** of
ad10: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
ad20: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
ad30: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
ad40: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
ad50: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
ad60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
ad70: 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a  nlOff+12, (u32 *
ad80: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
ad90: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
ada0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
adb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
adc0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
add0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ade0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
adf0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
ae00: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
ae10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ae20: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
ae30: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
ae40: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
ae50: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
ae60: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
ae70: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
ae80: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
ae90: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
aea0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
aeb0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
aec0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
aed0: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
aee0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
aef0: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
af00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
af10: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
af20: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
af30: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
af40: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
af50: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
af60: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
af70: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
af80: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
af90: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
afa0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
afb0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
afc0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
afd0: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
afe0: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
aff0: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
b000: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
b010: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
b020: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
b030: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
b040: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
b050: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
b060: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
b070: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
b080: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
b090: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
b0a0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
b0b0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
b0c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
b0d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
b0e0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
b0f0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
b100: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
b110: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
b120: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
b130: 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20   i64 jrnlSize;. 
b140: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
b150: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
b160: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b170: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
b180: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
b190: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
b1a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b1b0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
b1c0: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
b1d0: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
b1e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
b1f0: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
b200: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
b210: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
b220: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
b230: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
b240: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
b250: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
b260: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
b270: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
b280: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
b290: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
b2a0: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
b2b0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
b2c0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b2d0: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
b2e0: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
b2f0: 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a  ync ){.    seekJ
b300: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
b310: 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  );.  }.  jrnlOff
b320: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
b330: 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
b340: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
b350: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
b360: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
b370: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
b380: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
b390: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
b3a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
b3c0: 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72  nlOff += 4;..  r
b3d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b3e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b3f0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72  zMaster, len, jr
b400: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
b410: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
b420: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
b430: 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75  ff += len;..  pu
b440: 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65  t32bits(zBuf, le
b450: 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  n);.  put32bits(
b460: 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29  &zBuf[4], cksum)
b470: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66  ;.  memcpy(&zBuf
b480: 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  [8], aJournalMag
b490: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
b4a0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63  nalMagic));.  rc
b4b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
b4c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
b4d0: 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a  Buf, 8+sizeof(aJ
b4e0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72  ournalMagic), jr
b4f0: 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66  nlOff);.  jrnlOf
b500: 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a  f += 8+sizeof(aJ
b510: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
b520: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
b530: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
b540: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
b550: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
b560: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
b570: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
b580: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
b590: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
b5a0: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
b5b0: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
b5c0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
b5d0: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
b5e0: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
b5f0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b600: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
b610: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
b620: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
b630: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
b640: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
b650: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
b660: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
b670: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b680: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
b690: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
b6a0: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
b6b0: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
b6c0: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
b6d0: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
b6e0: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
b6f0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
b700: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
b710: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
b720: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
b730: 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
b740: 29 0a 20 20 20 26 26 20 28 72 63 20 3d 20 73 71  ).   && (rc = sq
b750: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b760: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72  pPager->jfd, &jr
b770: 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45  nlSize))==SQLITE
b780: 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  _OK.   && jrnlSi
b790: 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a  ze>jrnlOff.  ){.
b7a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b7b0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
b7c0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29  r->jfd, jrnlOff)
b7d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b7e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
b7f0: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
b800: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
b810: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
b820: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
b830: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b840: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
b850: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
b860: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
b870: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
b880: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
b890: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
b8a0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
b8b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
b8c0: 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  tCommit().** rou
b8d0: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
b8e0: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
b8f0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
b900: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
b910: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
b920: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
b930: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
b940: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
b950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b960: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
b970: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
b980: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b990: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b9a0: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
b9b0: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
b9c0: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
b9d0: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20    assert( MEMDB 
b9e0: 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d  );.  if( !pHist-
b9f0: 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  >inStmt ){.    a
ba00: 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50  ssert( pHist->pP
ba10: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48  revStmt==0 && pH
ba20: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  ist->pNextStmt==
ba30: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
ba40: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
ba50: 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53      PGHDR_TO_HIS
ba60: 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c  T(pPager->pStmt,
ba70: 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53   pPager)->pPrevS
ba80: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  tmt = pPg;.    }
ba90: 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78  .    pHist->pNex
baa0: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
bab0: 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65  pStmt;.    pPage
bac0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
bad0: 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
bae0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 1;.  }.}../*
baf0: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
bb00: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
bb10: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
bb20: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
bb30: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
bb40: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
bb50: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
bb60: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
bb70: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
bb80: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bb90: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
bba0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
bbb0: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
bbc0: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
bbd0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
bbe0: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
bbf0: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
bc00: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
bc10: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
bc20: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
bc30: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
bc40: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
bc50: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
bc60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
bc70: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
bc80: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
bc90: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
bca0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
bcb0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
bcc0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
bcd0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
bce0: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
bcf0: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
bd00: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
bd10: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
bd20: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
bd30: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
bd40: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
bd50: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
bd60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
bd70: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
bd80: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
bd90: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
bda0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
bdb0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
bdc0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
bdd0: 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
bde0: 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
bdf0: 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  no));.    PAGER_
be00: 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
be10: 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
be20: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  ;.    pNext = pP
be30: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
be40: 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
be50: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
be60: 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  _free(pPg->pData
be70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
be80: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
be90: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
bea0: 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20  ru.pFirst==0);. 
beb0: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
bec0: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
bed0: 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ==0);.  assert(p
bee0: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74  Pager->lru.pLast
bef0: 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ==0);.  pPager->
bf00: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61  pStmt = 0;.  pPa
bf10: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
bf20: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
bf30: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
bf40: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
bf50: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
bf60: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
bf70: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
bf80: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
bf90: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
bfa0: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
bfb0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
bfc0: 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
bfd0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bfe0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
bff0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
c000: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
c010: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
c020: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
c030: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
c040: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
c050: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
c060: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
c070: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
c080: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
c090: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
c0a0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
c0b0: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
c0c0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
c0d0: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
c0e0: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
c0f0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
c100: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
c110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c120: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
c130: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
c140: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c150: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
c160: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
c170: 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c    int rc = osUnl
c180: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c190: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
c1a0: 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d  if( rc ) pPager-
c1b0: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
c1c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
c1d0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ize = -1;.      
c1e0: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
c1f0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
c200: 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79  ..      /* Alway
c210: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
c220: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
c230: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
c240: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ase lock..      
c250: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
c260: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
c270: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
c280: 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a  de=delete might.
c290: 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20        ** delete 
c2a0: 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f  the file out fro
c2b0: 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
c2c0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
c2d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c2e0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  en ){.        sq
c2f0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c300: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
c310: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c320: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
c330: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c340: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c350: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c360: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49        pPager->pI
c370: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c380: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c390: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
c3a0: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
c3b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
c3c0: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
c3d0: 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73  be.      ** trus
c3e0: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
c3f0: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
c400: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
c410: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
c420: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
c430: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
c440: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
c450: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
c460: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c470: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
c480: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ode ){.        i
c490: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c4a0: 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   ) pPager->errCo
c4b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
c4c0: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
c4d0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
c4e0: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
c4f0: 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
c500: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
c510: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
c520: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  fd);.          s
c530: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
c540: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
c550: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
c560: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
c570: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
c580: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
c590: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  tmtOpen = 0;.   
c5a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
c5b0: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
c5c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c5d0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
c5e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c5f0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
c600: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c610: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
c620: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
c630: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
c640: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c650: 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
c660: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
c670: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
c680: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
c690: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
c6a0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65  OCK;.      pPage
c6b0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c6c0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ne = 0;.    }.  
c6d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
c6e0: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
c6f0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
c700: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
c710: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
c720: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
c730: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
c740: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
c750: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a  error state, .**
c760: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
c770: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  the rollback..*/
c780: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c790: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
c7a0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
c7b0: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 73   /* assert( p->s
c7c0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
c7d0: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
c7e0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a  alOpen==0 ); */.
c7f0: 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65    if( p->errCode
c800: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c810: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
c820: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
c830: 71 6c 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e  qlite3FaultBegin
c840: 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 20 20  Benign(-1);.    
c850: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
c860: 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c  back(p);.    sql
c870: 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69  ite3FaultEndBeni
c880: 67 6e 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 70 61  gn(-1);.  }.  pa
c890: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 23  ger_unlock(p);.#
c8a0: 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
c8b0: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
c8c0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
c8d0: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
c8e0: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
c8f0: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
c900: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
c910: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
c920: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c930: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c940: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
c950: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
c960: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
c970: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
c980: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
c990: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
c9a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
c9b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c9c0: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
c9d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c9e0: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
c9f0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
ca00: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
ca10: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
ca20: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
ca30: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
ca40: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
ca50: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
ca60: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
ca70: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
ca80: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
ca90: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
caa0: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
cab0: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
cac0: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
cad0: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
cae0: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
caf0: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
cb00: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
cb10: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
cb20: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
cb30: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
cb40: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
cb50: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
cb60: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
cb70: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
cb80: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
cb90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
cba0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
cbb0: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
cbc0: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
cbd0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
cbe0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
cbf0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
cc00: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
cc10: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
cc20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
cc30: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
cc40: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
cc50: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
cc60: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48  asMaster){.  PgH
cc70: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
cc80: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
cc90: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
cca0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
ccb0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
ccc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
ccd0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
cce0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ccf0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
cd00: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
cd10: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
cd20: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
cd30: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
cd40: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
cd50: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cd60: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
cd70: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
cd80: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
cd90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
cda0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
cdb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
cdc0: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
cdd0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
cde0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
cdf0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
ce00: 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ST.    ){.      
ce10: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
ce20: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
ce30: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
ce40: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
ce50: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
ce60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ce70: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
ce80: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
ce90: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
cea0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
ceb0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cec0: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
ced0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
cee0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
cef0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
cf00: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
cf10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
cf20: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
cf30: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
cf40: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
cf50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
cf60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69   }.    sqlite3Bi
cf70: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
cf80: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
cf90: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
cfa0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
cfb0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
cfc0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
cfd0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
cfe0: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
cff0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
d000: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
d010: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
d020: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
d030: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
d040: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
d050: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
d060: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
d070: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
d080: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
d090: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
d0a0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
d0b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
d0c0: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
d0d0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
d0e0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
d0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d100: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
d110: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
d120: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
d130: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
d140: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
d150: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
d160: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
d170: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
d180: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
d190: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
d1a0: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
d1b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
d1c0: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
d1d0: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
d1e0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
d1f0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
d200: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
d210: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
d220: 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74 53 65  = 0;.  lruListSe
d230: 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
d240: 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
d250: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
d260: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
d270: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
d280: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
d290: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
d2a0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
d2b0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
d2c0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
d2d0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
d2e0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
d2f0: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
d300: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
d310: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
d320: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
d330: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
d340: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
d350: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
d360: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
d370: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
d380: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
d390: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
d3a0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
d3b0: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
d3c0: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
d3d0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
d3e0: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
d3f0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
d400: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
d410: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
d420: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
d430: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
d440: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
d450: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
d460: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
d470: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
d480: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
d490: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
d4a0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
d4b0: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
d4c0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
d4d0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
d4e0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
d4f0: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
d500: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
d510: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
d520: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
d530: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
d540: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
d550: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
d560: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
d570: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
d580: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
d590: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
d5a0: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
d5b0: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
d5c0: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
d5d0: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
d5e0: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
d5f0: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
d600: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
d610: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
d620: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
d630: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
d640: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
d650: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
d660: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
d670: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
d680: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
d690: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
d6a0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
d6b0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d6c0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d6d0: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d6e0: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d6f0: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d700: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
d710: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d720: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
d730: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
d740: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
d750: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
d760: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
d770: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
d780: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
d790: 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
d7a0: 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a  an(PgHdr*);../*.
d7b0: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
d7c0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
d7d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
d7e0: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
d7f0: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
d800: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
d810: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
d820: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
d830: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
d840: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
d850: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
d860: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
d870: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
d880: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
d890: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
d8a0: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
d8b0: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
d8c0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
d8d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
d8e0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d8f0: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
d900: 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69 74  pPager, .  sqlit
d910: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20  e3_file *jfd,.  
d920: 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e  i64 offset,.  in
d930: 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20  t useCksum.){.  
d940: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
d950: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
d960: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
d970: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
d980: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
d990: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d9b0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
d9c0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
d9d0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
d9e0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
d9f0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
da00: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
da10: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
da20: 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38   u8 *aData = (u8
da30: 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
da40: 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20  pace;   /* Temp 
da50: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
da60: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43  ge */..  /* useC
da70: 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74  ksum should be t
da80: 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  rue for the main
da90: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c   journal and fal
daa0: 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74  se for.  ** stat
dab0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20  ement journals. 
dac0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
dad0: 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  s is always the 
dae0: 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  case.  */.  asse
daf0: 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43  rt( jfd == (useC
db00: 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a  ksum ? pPager->j
db10: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66  fd : pPager->stf
db20: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
db30: 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d  aData );..  rc =
db40: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
db50: 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b   offset, &pgno);
db60: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
db70: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
db80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
db90: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
dba0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
dbb0: 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
dbc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dbd0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
dbe0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
dbf0: 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
dc00: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a  >pageSize + 4;..
dc10: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
dc20: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
dc30: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
dc40: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
dc50: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
dc60: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
dc70: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
dc80: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
dc90: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
dca0: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
dcb0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
dcc0: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
dcd0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
dce0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
dcf0: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
dd00: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
dd10: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
dd20: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
dd30: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
dd40: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
dd50: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
dd60: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
dd70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dd80: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
dd90: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
dda0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
ddb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ddc0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
ddd0: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
dde0: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
ddf0: 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70  ts(jfd, offset+p
de00: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
de10: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
de20: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
de30: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
de40: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
de50: 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63  .    if( pager_c
de60: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
de70: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
de80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
de90: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
dea0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
deb0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
dec0: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
ded0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
dee0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
def0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
df00: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
df10: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
df20: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
df30: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
df40: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
df50: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
df60: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
df70: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
df80: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
df90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
dfa0: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
dfb0: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
dfc0: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
dfd0: 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
dfe0: 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
dff0: 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
e000: 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
e010: 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
e020: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
e030: 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
e040: 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
e050: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
e060: 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
e070: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e080: 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
e090: 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
e0a0: 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
e0b0: 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
e0c0: 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
e0d0: 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
e0e0: 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
e0f0: 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
e100: 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
e110: 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
e120: 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
e130: 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
e140: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
e150: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
e160: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
e170: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
e180: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
e190: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
e1a0: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
e1b0: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
e1c0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
e1d0: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
e1e0: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
e1f0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
e200: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
e210: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
e220: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
e230: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
e240: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
e250: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
e260: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
e270: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
e280: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
e290: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
e2a0: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
e2b0: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
e2c0: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
e2d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
e2e0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
e2f0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
e300: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
e310: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
e320: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
e330: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
e340: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
e350: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
e360: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
e370: 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
e380: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
e390: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
e3a0: 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
e3b0: 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
e3c0: 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
e3d0: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
e3e0: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
e3f0: 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
e400: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
e410: 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
e420: 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
e430: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
e440: 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
e450: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
e460: 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
e470: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
e480: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e490: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
e4a0: 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
e4b0: 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
e4c0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
e4d0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
e4e0: 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
e4f0: 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
e500: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
e510: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
e520: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
e530: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
e540: 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
e550: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
e560: 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
e570: 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
e580: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
e590: 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
e5a0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
e5b0: 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
e5c0: 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
e5d0: 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
e5e0: 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
e5f0: 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
e600: 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
e610: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
e620: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
e630: 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
e640: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ned..  */.  pPg 
e650: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
e660: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
e670: 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41  PAGERTRACE4("PLA
e680: 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
e690: 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
e6b0: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
e6c0: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
e6d0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
e6e0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a  eSize, aData));.
e6f0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e700: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e710: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
e720: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
e730: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26 26 20  ==0).        && 
e740: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
e750: 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34 20  hods ){.    i64 
e760: 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
e770: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
e780: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
e790: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
e7a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
e7b0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e7c0: 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
e7d0: 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
e7e0: 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
e7f0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
e800: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
e810: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
e820: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
e830: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
e840: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
e850: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
e860: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
e870: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
e880: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
e890: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
e8a0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
e8b0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
e8c0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
e8d0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
e8e0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
e8f0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
e900: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
e910: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
e920: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
e930: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
e940: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
e950: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
e960: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
e970: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
e980: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
e990: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
e9a0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
e9b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
e9c0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
e9d0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
e9e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
e9f0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
ea00: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
ea10: 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
ea20: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
ea30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
ea40: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
ea50: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
ea60: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
ea70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
ea80: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
ea90: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
eaa0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
eab0: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
eac0: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
ead0: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
eae0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
eaf0: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
eb00: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
eb10: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
eb20: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
eb30: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
eb40: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
eb50: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
eb60: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
eb70: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
eb80: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
eb90: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
eba0: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
ebb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ebc0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
ebd0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
ebe0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
ebf0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
ec00: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
ec10: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
ec20: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
ec30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
ec40: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
ec50: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
ec60: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
ec70: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
ec80: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
ec90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
eca0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
ecb0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
ecc0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
ecd0: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
ece0: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
ecf0: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
ed00: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
ed10: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
ed20: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
ed30: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
ed40: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ed50: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
ed60: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
ed70: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
ed80: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
ed90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
eda0: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
edb0: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
edc0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
edd0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
ede0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
edf0: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
ee00: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
ee10: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
ee20: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
ee30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ee40: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
ee50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
ee60: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
ee70: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
ee80: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
ee90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
eea0: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
eeb0: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
eec0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
eed0: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
eee0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
eef0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
ef00: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
ef10: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
ef20: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
ef30: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
ef40: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
ef50: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
ef60: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
ef70: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
ef80: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
ef90: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
efa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
efb0: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
efc0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
efd0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
efe0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
eff0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
f000: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
f010: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
f020: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
f030: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
f040: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 56  sqlite3Malloc(pV
f050: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
f060: 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
f070: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
f080: 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
f090: 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
f0a0: 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
f0b0: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
f0c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f0d0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c  else{.    int fl
f0e0: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
f0f0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
f100: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
f110: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
f120: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
f130: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
f140: 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
f150: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
f160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
f170: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
f180: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
f190: 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   1;..  rc = sqli
f1a0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
f1b0: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
f1c0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
f1d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
f1e0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
f1f0: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
f200: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
f210: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
f220: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
f230: 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
f240: 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
f250: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
f260: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
f270: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
f280: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
f290: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
f2a0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
f2b0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
f2c0: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
f2d0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
f2e0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
f2f0: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
f300: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
f310: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e  )sqlite3Malloc(n
f320: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
f330: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
f340: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
f350: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
f360: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f370: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
f380: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
f390: 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20  .    zMasterPtr 
f3a0: 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
f3b0: 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
f3c0: 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
f3d0: 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
f3e0: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
f3f0: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
f400: 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
f410: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
f420: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
f430: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
f440: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
f450: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
f460: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
f470: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
f480: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
f490: 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
f4a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f4b0: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f  Access(pVfs, zJo
f4c0: 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
f4d0: 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
f4e0: 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28  ists);.      if(
f4f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f500: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
f510: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
f520: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f530: 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
f540: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
f550: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
f560: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
f570: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
f580: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
f590: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
f5a0: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
f5b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f5c0: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
f5d0: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
f5e0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
f5f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f600: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
f610: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
f620: 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
f630: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
f640: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
f650: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
f660: 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  AL);.        rc 
f670: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
f680: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
f690: 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
f6a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
f6b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f6c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
f6d0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f6e0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f6f0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
f700: 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
f710: 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
f720: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
f730: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
f740: 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
f750: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f760: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f770: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f780: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f790: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
f7a0: 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
f7b0: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
f7c0: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
f7d0: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ==0;.        if(
f7e0: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
f7f0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
f800: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
f810: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f820: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
f830: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
f840: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
f850: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f860: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
f870: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
f880: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
f890: 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
f8a0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
f8b0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
f8c0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
f8d0: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
f8e0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
f8f0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
f900: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
f910: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
f920: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
f930: 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
f940: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
f950: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
f960: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
f970: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
f980: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
f990: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f  ger *pPager);../
f9a0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
f9b0: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
f9c0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
f9d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
f9e0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
f9f0: 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74  ed. Also truncat
fa00: 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70  e the cached rep
fa10: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
fa20: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d  he file..**.** M
fa30: 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
fa40: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
fa50: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
fa60: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61  smaller than nPa
fa70: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  ge..** This can 
fa80: 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
fa90: 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69  ple, if we are i
faa0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
fab0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
fac0: 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e   which has exten
fad0: 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ded the file siz
fae0: 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61  e and the new pa
faf0: 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c  ges are still al
fb00: 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63  l held.** in cac
fb10: 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45  he, then an INSE
fb20: 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65  RT or UPDATE doe
fb30: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  s a statement ro
fb40: 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a  llback.  Some.**
fb50: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
fb60: 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
fb70: 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
fb80: 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f  ed if you try to
fb90: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66  .** truncate a f
fba0: 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
fbb0: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
fbc0: 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c  than it currentl
fbd0: 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65  y is,.** so dete
fbe0: 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
fbf0: 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
fc00: 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68 65  zero byte to the
fc10: 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 0a   end of the new.
fc20: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ** file instead.
fc30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fc40: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
fc50: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
fc60: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
fc70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
fc80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
fc90: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
fca0: 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66  IVE && pPager->f
fcb0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
fcc0: 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
fcd0: 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
fce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
fcf0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
fd00: 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
fd10: 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
fd20: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
fd30: 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
fd40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fd50: 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
fd60: 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
fd70: 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
fd80: 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
fd90: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
fda0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
fdb0: 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
fdc0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
fdd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fde0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
fdf0: 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c  ager->fd, "", 1,
fe00: 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20   newSize-1);.   
fe10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
fe20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
fe30: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
fe40: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
fe50: 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
fe60: 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
fe70: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
fe80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
fe90: 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65  t the sectorSize
fea0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
feb0: 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ager..**.** The 
fec0: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
fed0: 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20 61  t least as big a
fee0: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
fef0: 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79  e reported.** by
ff00: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
ff10: 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69 6e  Size().  The min
ff20: 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a 65  imum sector size
ff30: 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74   is 512..*/.stat
ff40: 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
ff50: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
ff60: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 70  ger){.  assert(p
ff70: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
ff80: 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
ff90: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
ffa0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
ffb0: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
ffc0: 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
ffd0: 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
ffe0: 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
fff0: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
10000 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
10010 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
10020 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65 20   whcih case the 
10030 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
10040 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
10050 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f  segfault..    */
10060 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
10070 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
10080 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
10090 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20  ager->fd);.  }. 
100a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
100b0 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20  torSize<512 ){. 
100c0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
100d0 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
100e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
100f0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
10100 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
10110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10120 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
10130 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
10140 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
10150 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
10160 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
10170 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
10180 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
10190 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
101a0 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
101b0 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
101c0 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
101d0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
101e0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
101f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
10200 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
10210 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
10220 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
10230 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
10240 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
10250 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
10260 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
10270 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
10280 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
10290 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
102a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
102b0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
102c0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
102d0 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
102e0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
102f0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
10300 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
10310 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10320 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
10330 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
10340 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
10350 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
10360 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
10370 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
10380 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
10390 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
103a0 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
103b0 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
103c0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
103d0 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
103e0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
103f0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
10400 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20  e case..**  (7) 
10410 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
10420 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
10430 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
10440 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10450 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
10460 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
10470 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
10480 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
10490 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
104a0 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
104b0 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f    (8)  N bytes o
104c0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
104d0 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
104e0 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
104f0 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
10500 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
10510 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
10520 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10530 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
10540 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
10550 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
10560 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
10570 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
10580 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
10590 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
105a0 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
105b0 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
105c0 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20  *  (9)  Zero or 
105d0 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
105e0 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
105f0 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
10600 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
10610 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
10620 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
10630 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
10640 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
10650 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
10660 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
10670 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
10680 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
10690 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38  mean the first 8
106a0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
106b0 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
106c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
106d0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
106e0 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   9th item..**.**
106f0 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
10700 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
10710 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
10720 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
10730 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
10740 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
10750 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
10760 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
10770 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
10780 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
10790 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
107a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
107b0 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
107c0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
107d0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
107e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
107f0 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
10800 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
10810 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
10820 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
10830 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
10840 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
10850 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
10860 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
10870 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
10880 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
10890 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
108a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
108b0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
108c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
108d0 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
108e0 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
108f0 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
10900 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
10910 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
10920 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
10930 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
10940 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
10950 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
10960 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
10970 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
10980 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
10990 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
109a0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
109b0 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
109c0 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
109d0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
109e0 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
109f0 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
10a00 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
10a10 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
10a20 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
10a30 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
10a40 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
10a50 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
10a60 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
10a70 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
10a80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
10a90 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
10aa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10ab0 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
10ac0 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
10ad0 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
10ae0 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
10af0 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
10b00 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
10b10 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
10b20 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
10b30 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
10b40 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
10b50 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
10b60 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
10b70 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
10b80 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
10b90 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
10ba0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
10bb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
10bc0 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
10bd0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10be0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
10bf0 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
10c00 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
10c10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
10c20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
10c30 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
10c40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10c50 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
10c60 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
10c70 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
10c80 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
10c90 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10ca0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10cb0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
10cc0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
10cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10ce0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
10cf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
10d00 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10d20 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
10d30 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
10d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10d50 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
10d60 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
10d70 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
10da0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
10db0 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
10dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
10dd0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
10de0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
10df0 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
10e00 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
10e10 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
10e20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
10e30 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
10e40 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
10e50 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
10e60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
10e70 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
10e80 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10e90 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
10ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10eb0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
10ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10ed0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10ee0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
10ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10f00 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
10f10 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
10f20 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
10f30 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
10f40 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
10f50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
10f60 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
10f70 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
10f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
10f90 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
10fa0 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
10fb0 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
10fc0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
10fd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
10fe0 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
10ff0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
11000 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
11010 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
11020 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
11030 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
11040 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
11050 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
11060 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
11070 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
11080 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11090 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
110a0 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
110b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
110c0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
110d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
110e0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
110f0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
11100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11110 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
11120 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
11130 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
11140 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
11150 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
11160 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
11170 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
11180 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
11190 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
111a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
111b0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
111c0 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
111d0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
111e0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
111f0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
11200 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
11210 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
11220 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
11230 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
11240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
11250 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
11260 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
11270 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
11280 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
11290 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
112a0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
112b0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
112c0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
112d0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
112e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
112f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
11300 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
11310 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
11320 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
11330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11340 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
11350 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
11360 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11370 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
11380 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
11390 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
113a0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
113b0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
113c0 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
113d0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
113e0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
113f0 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
11400 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
11410 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
11420 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
11430 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
11440 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
11450 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
11460 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
11470 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
11480 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
11490 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
114a0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
114b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
114c0 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
114d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
114e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
114f0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
11500 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
11510 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
11520 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
11530 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
11540 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
11550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11560 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
11570 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
11580 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11590 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
115a0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
115b0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
115c0 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
115d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
115e0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
115f0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
11600 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
11610 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
11620 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
11630 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
11640 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
11650 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
11660 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
11670 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
11680 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
11690 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
116a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
116b0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
116c0 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
116d0 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
116e0 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  65..    */.    i
116f0 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
11700 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
11710 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
11720 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
11730 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
11740 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
11750 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
11760 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
11770 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
11780 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
11790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
117a0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
117b0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
117c0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
117d0 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
117e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
117f0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
11800 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
11810 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11820 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11830 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
11840 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
11850 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
11860 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
11870 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
11880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11890 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
118a0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
118b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
118c0 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
118d0 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
118e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
118f0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
11900 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
11910 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11920 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
11930 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
11940 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
11950 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
11960 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
11970 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
11980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
119a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
119b0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
119c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
119d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
119e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
119f0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
11a00 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
11a10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  se{.          go
11a20 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
11a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11a40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
11a50 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
11a60 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
11a70 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
11a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11a90 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
11aa0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
11ab0 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
11ac0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
11ad0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
11ae0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
11af0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
11b00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
11b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11b20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
11b30 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
11b40 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
11b50 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66 28  '\0');.  }.  if(
11b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11b70 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
11b80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
11b90 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
11ba0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
11bb0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
11bc0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
11bd0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
11be0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
11bf0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11c00 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
11c10 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
11c20 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
11c30 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
11c40 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
11c50 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
11c60 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
11c70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
11c80 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
11c90 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
11ca0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
11cb0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
11cc0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
11cd0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
11ce0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
11cf0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
11d00 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
11d10 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
11d20 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
11d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
11d40 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11d50 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
11d60 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
11d70 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
11d80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11d90 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
11da0 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
11db0 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
11dc0 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
11dd0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
11de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11df0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11e00 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
11e10 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
11e20 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
11e30 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
11e40 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
11e50 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
11e60 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
11e70 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
11e80 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
11e90 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11ea0 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
11eb0 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
11ec0 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
11ed0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11ee0 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
11ef0 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
11f00 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
11f10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11f20 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
11f30 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
11f40 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
11f70 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
11f80 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
11f90 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
11fa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11fb0 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
11fc0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11fe0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11ff0 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
12000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12010 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68  Off;..  /* Set h
12020 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
12030 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65  offset just afte
12040 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
12050 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   last journal.  
12060 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ** page written 
12070 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
12080 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
12090 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
120a0 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
120b0 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c  ion was written,
120c0 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
120d0 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
120e0 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
120f0 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
12100 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
12110 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
12120 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
12130 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
12140 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
12150 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
12160 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
12170 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
12180 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
12190 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
121a0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
121b0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
121c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
121d0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
121e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
121f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
12200 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
12210 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
12220 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
12230 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
12240 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
12250 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12260 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
12270 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12280 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  en );.  nRec = p
12290 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
122a0 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
122b0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
122c0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
122d0 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
122e0 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
122f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12300 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
12310 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
12320 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
12330 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
12340 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
12350 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
12360 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
12370 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
12380 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
12390 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
123a0 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
123b0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
123c0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
123d0 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
123e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
123f0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
12400 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f   pPager->stfd, o
12410 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61  ffset, 0);.    a
12420 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12430 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
12440 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12450 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
12460 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
12470 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
12480 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
12490 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
124a0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
124b0 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
124c0 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
124d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
124e0 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
124f0 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
12500 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
12510 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
12520 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
12530 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
12540 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
12550 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
12560 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
12570 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
12580 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
12590 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
125a0 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
125b0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
125c0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
125d0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
125e0 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
125f0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
12600 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
12610 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
12620 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
12630 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
12640 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
12650 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
12660 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
12670 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12680 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
12690 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
126a0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
126b0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
126c0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
126d0 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61  alOff, 1);.    a
126e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
126f0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
12700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12710 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
12720 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
12730 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
12740 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
12750 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
12760 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
12770 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
12780 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
12790 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
127a0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
127b0 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
127c0 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
127d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
127e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
127f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12800 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
12810 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
12820 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
12830 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
12840 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
12850 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
12860 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
12870 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
12880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
12890 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
128a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
128b0 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
128c0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
128d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
128e0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
128f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12900 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
12910 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
12920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12930 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
12940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
12950 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
12960 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
12970 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12980 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
12990 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
129a0 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
129b0 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
129c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
129d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
129e0 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
129f0 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
12a00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12a10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
12a20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
12a30 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
12a40 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
12a50 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
12a60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
12a70 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
12a80 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
12a90 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
12aa0 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
12ab0 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
12ac0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
12ad0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
12ae0 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
12af0 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
12b00 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
12b10 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
12b20 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
12b30 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
12b40 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
12b50 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
12b60 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
12b70 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
12b80 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
12b90 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
12ba0 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
12bb0 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
12bc0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
12bd0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
12be0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
12bf0 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
12c00 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
12c10 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
12c20 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
12c30 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
12c40 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
12c50 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
12c60 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
12c70 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12c80 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
12c90 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
12ca0 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
12cb0 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
12cc0 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
12cd0 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
12ce0 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
12cf0 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
12d00 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
12d10 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
12d20 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
12d30 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
12d40 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
12d50 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
12d60 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
12d70 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12d80 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
12d90 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
12da0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
12db0 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
12dc0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
12dd0 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
12de0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
12df0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
12e00 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
12e10 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
12e20 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12e30 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
12e40 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
12e50 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
12e60 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
12e70 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
12e80 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
12e90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
12ea0 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
12eb0 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
12ec0 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
12ed0 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
12ee0 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
12ef0 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
12f00 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
12f10 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
12f20 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
12f30 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
12f40 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
12f50 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12f60 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
12f70 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
12f80 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
12f90 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12fa0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
12fb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12fc0 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
12fd0 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
12fe0 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
12ff0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13000 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
13010 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
13020 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
13030 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
13040 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
13050 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
13060 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
13070 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
13080 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
13090 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
130a0 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
130b0 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
130c0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
130d0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
130e0 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54  full_fsync?SQLIT
130f0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
13100 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
13110 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
13120 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
13130 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
13140 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
13150 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
13160 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
13170 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
13180 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
13190 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
131a0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
131b0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
131c0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
131d0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
131e0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
131f0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
13200 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
13210 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
13220 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
13230 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
13240 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a  emporary file. .
13250 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
13260 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13270 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
13280 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
13290 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
132a0 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
132b0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
132c0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
132d0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
132e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  the temporary.**
132f0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
13300 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
13310 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
13320 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
13330 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
13340 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
13350 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
13360 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
13370 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
13380 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13390 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
133a0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
133b0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
133c0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
133d0 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
133e0 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
133f0 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
13400 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
13410 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
13420 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
13430 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
13440 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
13450 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
13460 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
13470 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
13480 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
13490 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
134a0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
134b0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
134c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
134d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
134e0 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
134f0 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
13500 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
13510 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d  _OK || pFile->pM
13520 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75  ethods );.  retu
13530 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13540 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
13550 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
13560 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13570 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
13580 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
13590 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
135a0 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
135b0 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
135c0 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
135d0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
135e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
135f0 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  rGet() and is on
13600 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
13610 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
13620 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
13630 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
13640 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  erUnref()..**.**
13650 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
13660 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
13670 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
13680 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
13690 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
136a0 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
136b0 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
136c0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
136d0 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
136e0 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
136f0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
13700 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
13710 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
13720 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
13730 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
13740 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72  ..** It is never
13750 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
13760 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
13770 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
13780 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79   an.** in-memory
13790 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
137a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
137b0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
137c0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
137d0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
137e0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
137f0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
13800 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
13810 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
13820 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
13830 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13840 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
13850 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
13860 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
13870 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
13880 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
13890 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
138a0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
138b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
138c0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
138e0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
138f0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
13900 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
13920 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
13930 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
13940 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
13950 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
13960 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
13970 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13980 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
13990 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
139a0 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
139b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
139c0 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
139d0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
139e0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
139f0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
13a00 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
13a10 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
13a20 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
13a30 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
13a40 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a  eSize = sqlite3J
13a50 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
13a60 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c 74  ;.  int nDefault
13a70 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Page = SQLITE_DE
13a80 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13a90 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
13aa0 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  me = 0;.  int nP
13ab0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  athname = 0;..  
13ac0 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72  /* The default r
13ad0 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20  eturn is a NULL 
13ae0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70  pointer */.  *pp
13af0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
13b00 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
13b10 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
13b20 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
13b30 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
13b40 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
13b50 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
13b60 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
13b70 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
13b80 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
13b90 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
13ba0 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
13bb0 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
13bc0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13bd0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
13be0 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68  [0] ){.    nPath
13bf0 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13c00 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
13c10 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
13c20 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  e3Malloc(nPathna
13c30 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
13c40 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
13c50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13c60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
13c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13c80 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
13c90 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
13ca0 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
13cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
13cc0 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
13cd0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
13ce0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
13cf0 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  f.    {.      rc
13d00 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
13d10 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
13d20 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
13d30 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
13d40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13d50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13d70 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
13d80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13d90 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e      }.    nPathn
13da0 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61  ame = strlen(zPa
13db0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  thname);.  }..  
13dc0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
13dd0 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  ry for the pager
13de0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
13df0 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
13e00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
13e10 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
13e20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
13e30 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
13e40 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
13e50 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20  eSize +         
13e60 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
13e70 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
13e80 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a  */ .    pVfs->sz
13e90 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20 20 20  OsFile * 3 +    
13ea0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
13eb0 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e  db and two journ
13ec0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
13ed0 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   3*nPathname + 4
13ee0 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0            /* 
13ef0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65  zFilename, zDire
13f00 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20  ctory, zJournal 
13f10 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70  */.  );.  if( !p
13f20 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Pager ){.    sql
13f30 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
13f40 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13f50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13f60 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20   }.  pPtr = (u8 
13f70 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
13f80 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13f90 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70   = vfsFlags;.  p
13fa0 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c  Pager->fd = (sql
13fb0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13fc0 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13fd0 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  0];.  pPager->st
13fe0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
13ff0 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
14000 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70  szOsFile*1];.  p
14010 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71  Pager->jfd = (sq
14020 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
14030 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
14040 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  *2];.  pPager->z
14050 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
14060 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
14070 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c  OsFile*2+journal
14080 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
14090 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
140a0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
140b0 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
140c0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
140d0 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
140e0 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
140f0 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
14100 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
14110 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
14120 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
14130 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14140 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
14150 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73  thname+1);.    s
14160 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
14170 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  hname);.  }..  /
14180 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
14190 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
141a0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
141b0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
141c0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28  memDb ){.    if(
141d0 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73   nPathname>(pVfs
141e0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73  ->mxPathname - s
141f0 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22  izeof("-journal"
14200 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  )) ){.      rc =
14210 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
14220 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14230 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
14240 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14250 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
14260 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14270 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  e, pPager->fd,. 
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
142a0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
142b0 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
142c0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
142d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
142e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
142f0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
14300 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
14310 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
14320 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68  ess,.      ** ch
14330 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
14340 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
14350 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
14360 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
14370 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
14380 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
14390 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
143a0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a  mum of:.      **
143b0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  .      **    + S
143c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
143d0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a  GE_SIZE,.      *
143e0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
143f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
14400 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
14410 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  ().      **    +
14420 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
14430 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
14440 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
14450 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  cally..      */.
14460 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14470 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
14480 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
14490 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
144a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
144b0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
144c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
144d0 44 65 66 61 75 6c 74 50 61 67 65 3c 69 53 65 63  DefaultPage<iSec
144e0 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
144f0 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67       nDefaultPag
14500 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
14510 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
14520 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14530 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
14540 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
14550 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
14560 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
14570 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
14580 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ->fd);.         
14590 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
145a0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
145b0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
145c0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
145d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
145e0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
145f0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
14600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
14610 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
14620 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
14630 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
14640 20 20 20 20 66 6f 72 28 69 69 3d 6e 44 65 66 61      for(ii=nDefa
14650 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c  ultPage; ii<=SQL
14660 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
14670 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
14680 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
14690 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
146a0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
146b0 69 3e 3e 38 29 29 20 29 20 6e 44 65 66 61 75 6c  i>>8)) ) nDefaul
146c0 74 50 61 67 65 20 3d 20 69 69 3b 0a 20 20 20 20  tPage = ii;.    
146d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
146e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
146f0 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67   if( nDefaultPag
14700 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
14710 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
14720 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66  {.          nDef
14730 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
14740 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
14750 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
14760 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14770 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 6d 65  .  }else if( !me
14780 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mDb ){.    /* If
14790 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
147a0 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
147b0 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
147c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
147d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
147e0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
147f0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
14800 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
14810 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
14820 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
14830 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
14840 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
14850 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
14860 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
14870 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
14880 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
14890 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
148a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
148b0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
148c0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
148d0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e  ite3MallocZero(n
148e0 44 65 66 61 75 6c 74 50 61 67 65 29 3b 0a 20 20  DefaultPage);.  
148f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
14900 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65  ror occured in e
14910 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
14920 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20  cks above..  ** 
14930 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  Free the Pager s
14940 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
14950 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
14960 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  * Since the page
14970 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  r is not allocat
14980 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  ed there is no n
14990 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a  eed to set .  **
149a0 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61   any Pager.errMa
149b0 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  sk variables..  
149c0 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  */.  if( !pPager
149d0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d   || !pPager->pTm
149e0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71  pSpace ){.    sq
149f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
14a00 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
14a10 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
14a20 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
14a30 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
14a40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
14a50 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
14a60 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
14a70 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
14a80 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
14a90 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14aa0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
14ab0 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
14ac0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
14ad0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20  ilename))..  /* 
14ae0 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44  Fill in Pager.zD
14af0 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20  irectory[] */.  
14b00 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
14b10 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65  Directory, pPage
14b20 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
14b30 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f  athname+1);.  fo
14b40 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65  r(i=strlen(pPage
14b50 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20  r->zDirectory); 
14b60 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
14b70 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
14b80 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
14b90 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
14ba0 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
14bb0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  = 0;..  /* Fill 
14bc0 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  in Pager.zJourna
14bd0 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  l[] */.  if( zPa
14be0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65  thname ){.    me
14bf0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
14c00 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  urnal, pPager->z
14c10 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
14c20 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
14c30 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
14c40 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
14c50 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20  -journal", 9);. 
14c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
14c70 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30  er->zJournal = 0
14c80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67  ;.  }..  /* pPag
14c90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14ca0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14cb0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
14cc0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
14cd0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
14ce0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
14cf0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
14d00 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
14d10 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
14d20 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
14d30 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
14d40 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
14d50 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
14d60 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
14d70 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
14d80 3e 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66  >pageSize = nDef
14d90 61 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70  aultPage;.  /* p
14da0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
14db0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14dc0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
14dd0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14de0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
14df0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  /.  pPager->mxPa
14e00 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67  ge = 100;.  pPag
14e10 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
14e20 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
14e30 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
14e40 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
14e50 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
14e60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14e70 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
14e80 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14e90 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
14ea0 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
14eb0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
14ec0 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
14ed0 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
14ee0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
14ef0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14f00 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
14f10 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
14f20 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
14f30 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
14f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
14f50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14f60 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
14f70 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
14f80 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
14f90 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
14fa0 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
14fb0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
14fc0 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
14fd0 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
14fe0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
14ff0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
15000 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
15010 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
15020 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
15030 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
15040 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67  ync?0:1);.  pPag
15050 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
15060 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
15070 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
15080 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
15090 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
150a0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
150b0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
150c0 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
150d0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
150e0 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
150f0 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67  (nExtra);.  pPag
15100 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
15110 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
15120 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
15130 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
15140 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
15150 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c  Methods||memDb||
15160 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
15170 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
15180 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
15190 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  ger);.  }.  /* p
151a0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
151b0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
151c0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
151d0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
151e0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
151f0 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
15200 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
15210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15220 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
15230 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
15240 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  eMM = 0;.  pPage
15250 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b  r->iInUseDB = 0;
15260 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
15270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15280 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73  MUTEX_NOOP.    s
15290 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
152a0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
152b0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
152c0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
152d0 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  M2);.#endif.    
152e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
152f0 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
15300 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pPager->pNext = 
15310 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
15320 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
15330 33 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20  3PagerList ){.  
15340 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15350 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50  te3PagerList->pP
15360 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rev==0 );.      
15370 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
15380 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72  ->pPrev = pPager
15390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
153a0 65 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  er->pPrev = 0;. 
153b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
153c0 69 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ist = pPager;.  
153d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
153e0 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
153f0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
15400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15410 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
15420 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
15430 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
15440 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
15450 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
15460 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
15470 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
15480 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
15490 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
154a0 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
154b0 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
154c0 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
154d0 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
154e0 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
154f0 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
15500 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
15510 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
15520 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
15530 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
15540 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
15550 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
15560 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
15570 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
15580 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
15590 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
155a0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
155b0 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
155c0 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
155d0 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
155e0 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
155f0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
15600 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
15610 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
15620 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
15630 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
15640 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
15650 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
15660 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
15670 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
15680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
15690 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
156a0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
156b0 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
156c0 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
156d0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
156e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
156f0 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
15700 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
15710 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
15720 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
15730 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
15740 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
15750 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
15760 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
15770 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
15780 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
15790 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
157a0 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
157b0 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
157c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
157d0 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
157e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
157f0 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
15800 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
15810 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
15820 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
15830 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
15840 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65  e size to *pPage
15850 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67  Size. If the sug
15860 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69  gest new page si
15870 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f  ze is.** inappro
15880 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
15890 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
158a0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
158b0 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65  that.** value be
158c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
158d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
158e0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
158f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
15900 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20  6 *pPageSize){. 
15910 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15920 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53  _OK;.  u16 pageS
15930 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
15940 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
15950 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
15960 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
15970 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
15980 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
15990 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26    if( pageSize &
159a0 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
159b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
159c0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d   && !pPager->mem
159d0 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  Db && pPager->nR
159e0 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  ef==0 .  ){.    
159f0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
15a00 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ar *)sqlite3Mall
15a10 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
15a20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
15a30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15a40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
15a50 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e  e{.      pagerEn
15a60 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
15a70 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
15a80 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
15a90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
15aa0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
15ab0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
15ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
15ad0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
15ae0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
15af0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
15b00 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
15b10 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28       pagerLeave(
15b20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
15b30 20 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20   }.  *pPageSize 
15b40 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
15b50 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ze;.  return rc;
15b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15b70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
15b80 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
15b90 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
15ba0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
15bb0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
15bc0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
15bd0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
15be0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
15bf0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
15c00 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
15c10 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
15c20 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
15c30 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
15c40 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
15c50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
15c60 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
15c70 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
15c80 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
15c90 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
15ca0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
15cb0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
15cc0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
15cd0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
15ce0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
15cf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15d00 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
15d10 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
15d20 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
15d30 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
15d40 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
15d50 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
15d60 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
15d70 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
15d80 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
15d90 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
15da0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
15db0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
15dc0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
15dd0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
15de0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15df0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
15e00 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
15e10 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
15e20 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
15e30 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
15e40 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
15e50 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
15e60 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
15e70 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
15e80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
15e90 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
15ea0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
15eb0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
15ec0 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  er, 0);.  return
15ed0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
15ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
15ef0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
15f00 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
15f10 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
15f20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
15f30 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
15f40 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
15f50 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
15f60 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
15f70 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
15f80 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
15f90 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
15fa0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
15fb0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
15fc0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
15fd0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
15fe0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
15ff0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
16000 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16010 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
16020 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
16030 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
16040 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
16050 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
16060 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
16070 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
16080 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
16090 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
160a0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
160b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
160c0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
160d0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
160e0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
160f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
16100 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
16110 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
16120 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
16130 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
16140 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
16150 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
16160 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
16170 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
16180 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
16190 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
161a0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
161b0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
161c0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
161d0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
161e0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
161f0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
16200 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
16210 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
16220 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
16230 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
16240 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
16250 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
16260 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
16270 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
16280 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
16290 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
162a0 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
162b0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
162c0 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
162d0 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
162e0 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
162f0 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
16300 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
16310 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
16320 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
16330 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
16340 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
16350 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
16360 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
16370 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
16380 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
16390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
163a0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
163b0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
163c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
163d0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
163e0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
163f0 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d  t(MEMDB||pPager-
16400 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
16410 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
16420 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16430 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
16440 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
16450 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
16460 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
16470 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
16480 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
16490 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20  Dest, N, 0);.   
164a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
164b0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
164c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
164d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
164e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
164f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16500 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
16510 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
16520 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
16530 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
16540 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
16550 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
16560 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
16570 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
16580 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
16590 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
165a0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
165b0 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
165c0 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
165d0 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
165e0 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
165f0 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
16600 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
16610 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
16620 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
16630 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
16640 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
16650 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
16660 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
16670 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
16680 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
16690 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20  .  i64 n = 0;.  
166a0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
166b0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
166c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
166d0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
166e0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
166f0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
16700 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
16710 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
16720 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
16730 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lse {.    assert
16740 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
16750 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
16760 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  empFile);.    if
16770 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( (pPager->fd->p
16780 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26  Methods).     &&
16790 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
167a0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
167b0 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
167c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
167d0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
167e0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
167f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16800 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
16810 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  -;.      return 
16820 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
16830 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
16840 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
16850 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
16860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
16870 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16880 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
16890 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
168a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
168b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
168c0 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
168d0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
168e0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
168f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
16900 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
16910 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78  if( n>pPager->mx
16920 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
16930 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a  er->mxPgno = n;.
16940 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65    }.  if( pnPage
16950 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20   ){.    *pnPage 
16960 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
16970 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16990 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
169a0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
169b0 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
169c0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
169d0 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
169e0 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
169f0 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
16a00 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
16a10 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
16a20 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
16a30 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
16a40 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
16a50 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
16a60 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
16a70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
16a80 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
16a90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
16aa0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
16ab0 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
16ac0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68  k pPg from its h
16ad0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
16ae0 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
16af0 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
16b00 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
16b10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
16b20 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
16b30 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
16b40 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
16b50 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
16b60 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
16b70 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
16b80 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
16b90 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
16ba0 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
16bb0 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
16bc0 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
16bd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
16be0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
16bf0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
16c00 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
16c10 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
16c20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
16c30 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
16c40 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
16c50 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
16c60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
16c70 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
16c80 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
16c90 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
16ca0 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
16cb0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
16cc0 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
16cd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
16ce0 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
16cf0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
16d00 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
16d10 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
16d20 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
16d30 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
16d40 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
16d50 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
16d60 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
16d70 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
16d80 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
16d90 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
16da0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
16db0 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
16dc0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
16dd0 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
16de0 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
16df0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
16e00 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
16e10 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
16e20 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
16e30 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
16e40 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
16e50 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
16e60 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
16e70 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
16e80 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
16e90 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
16ea0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
16eb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16ec0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
16ed0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
16ee0 20 66 72 65 65 20 70 61 67 65 20 6c 69 73 74 20   free page list 
16ef0 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  */.  lruListRemo
16f00 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55  ve(pPg);..  /* U
16f10 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
16f20 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
16f30 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
16f40 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
16f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16f60 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
16f70 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
16f80 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74  cache when a dat
16f90 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e  abase.** is trun
16fa0 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f  cated.  Drop fro
16fb0 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20  m the cache all 
16fc0 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
16fd0 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68   is.** larger th
16fe0 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
16ff0 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
17000 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  enced..**.** Ref
17010 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
17020 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
17030 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
17040 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  oed..**.** Actua
17050 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e  lly, at the poin
17060 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
17070 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75  s called, it wou
17080 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  ld be.** an erro
17090 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65  r to have a refe
170a0 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75  renced page.  Bu
170b0 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65  t rather than de
170c0 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67  lete.** that pag
170d0 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20  e and guarantee 
170e0 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67  a subsequent seg
170f0 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20  fault, it seems 
17100 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72  better.** to zer
17110 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68  o it and hope th
17120 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20  at we error out 
17130 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sanely..*/.stati
17140 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
17150 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
17160 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
17170 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
17180 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
17190 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
171a0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
171b0 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
171c0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
171d0 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
171e0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
171f0 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
17200 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
17210 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
17220 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
17230 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
17240 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
17250 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
17260 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17270 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
17280 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
17290 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
172a0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
172b0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
172c0 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
172d0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
172e0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
172f0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
17300 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
17310 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  unt);.      unli
17320 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
17330 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
17340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17350 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  _free(pPg->pData
17360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17370 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
17380 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
17390 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
173a0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
173b0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
173c0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
173d0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
173e0 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
173f0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
17400 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
17410 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
17420 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
17430 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
17440 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
17450 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
17460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
17470 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
17480 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
17490 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
174a0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
174b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
174c0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
174d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
174e0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
174f0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
17500 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
17510 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
17520 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
17530 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
17540 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
17550 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
17560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
17570 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
17580 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
17590 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
175a0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
175b0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
175c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
175d0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
175e0 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
175f0 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
17600 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
17610 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
17620 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
17630 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
17640 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
17650 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17660 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
17670 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
17690 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
176a0 6e 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d 3e  ndler ) pPager->
176b0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42  pBusyHandler->nB
176c0 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20  usy = 0;.    do 
176d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
176e0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
176f0 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
17700 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
17710 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
17720 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
17730 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
17740 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
17750 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
17760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17770 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
17780 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
17790 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
177a0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
177b0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
177c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
177d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
177e0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
177f0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
17800 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
17810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17820 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
17830 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
17840 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
17850 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
17860 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
17870 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
17880 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
17890 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
178a0 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
178b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
178c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
178d0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
178e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
178f0 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
17900 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
17910 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17930 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
17940 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
17950 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
17960 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
17970 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
17980 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17990 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65  E_OK;.  }.  page
179a0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
179b0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
179c0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  al(pPager);.  pa
179d0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
179e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
179f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17a00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
17a10 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
17a20 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
17a30 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
17a40 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
17a50 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
17a60 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
17a70 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
17a80 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
17a90 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65  LOCK);.  pagerLe
17aa0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ave(pPager);.  i
17ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17ad0 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
17ae0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
17af0 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
17b00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17b10 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
17b20 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
17b30 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
17b40 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
17b50 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
17b60 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
17b70 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
17b80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
17b90 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
17ba0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
17bb0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
17bc0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
17bd0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
17be0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
17bf0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
17c00 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
17c10 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
17c20 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
17c30 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
17c40 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
17c50 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
17c60 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
17c70 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
17c80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17c90 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
17ca0 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
17cb0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
17cc0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
17cd0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
17ce0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
17cf0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
17d00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
17d10 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
17d20 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
17d30 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
17d40 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
17d50 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
17d60 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
17d70 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
17d80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17d90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17da0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
17db0 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d  AGEMENT.  if( !M
17dc0 45 4d 44 42 20 29 7b 0a 23 69 66 6e 64 65 66 20  EMDB ){.#ifndef 
17dd0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f  SQLITE_MUTEX_NOO
17de0 50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  P.    sqlite3_mu
17df0 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c  tex *mutex = sql
17e00 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
17e10 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
17e20 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64  ATIC_MEM2);.#end
17e30 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  if.    sqlite3_m
17e40 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
17e50 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17e60 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
17e70 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d    pPager->pPrev-
17e80 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
17e90 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
17ea0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
17eb0 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67  PagerList = pPag
17ec0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
17ed0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17ee0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
17ef0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70  pPager->pNext->p
17f00 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70  Prev = pPager->p
17f10 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
17f20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
17f30 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
17f40 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c  #endif..  disabl
17f50 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17f60 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
17f70 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69  e3FaultBeginBeni
17f80 67 6e 28 2d 31 29 3b 0a 20 20 70 50 61 67 65 72  gn(-1);.  pPager
17f90 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
17fa0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
17fb0 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
17fc0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17fd0 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
17fe0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
17ff0 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
18000 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
18010 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61  s();.  sqlite3Fa
18020 75 6c 74 45 6e 64 42 65 6e 69 67 6e 28 2d 31 29  ultEndBenign(-1)
18030 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
18040 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
18050 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18060 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
18070 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
18080 29 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ).  if( pPager->
18090 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
180a0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
180b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
180c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74    }.  sqlite3Bit
180d0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
180e0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
180f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18100 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
18110 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
18120 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a  ger->stfd);.  }.
18130 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18140 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
18150 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
18160 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
18170 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
18180 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
18190 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
181a0 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
181b0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
181c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
181d0 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33  .  */..  sqlite3
181e0 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
181f0 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ash);.  sqlite3_
18200 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  free(pPager->pTm
18210 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
18220 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
18230 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18240 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
18250 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
18260 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
18270 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
18280 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
18290 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
182a0 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
182b0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
182c0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
182d0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
182e0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
182f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
18300 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
18310 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
18320 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
18330 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
18340 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
18350 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
18360 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
18370 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
18380 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
18390 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
183a0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
183b0 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
183c0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
183d0 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
183e0 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
183f0 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
18400 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
18410 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
18420 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
18430 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
18440 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
18450 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
18460 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
18470 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
18480 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
18490 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
184a0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
184b0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
184c0 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
184d0 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
184e0 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
184f0 69 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69  it. */.    lruLi
18500 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20  stRemove(pPg);. 
18510 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
18520 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
18530 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23 69 66  g->nRef++;.}.#if
18540 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18550 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
18560 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
18570 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
18580 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
18590 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
185a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
185b0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
185c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
185d0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
185e0 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
185f0 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
18600 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
18610 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
18620 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
18630 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
18640 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
18650 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
18660 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
18670 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
18680 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
18690 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
186a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65  ge *pPg){.  page
186b0 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67  rEnter(pPg->pPag
186c0 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  er);.  page_ref(
186d0 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  pPg);.  pagerLea
186e0 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  ve(pPg->pPager);
186f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18700 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
18710 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
18720 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
18730 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
18740 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
18750 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
18760 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
18770 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
18780 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
18790 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
187a0 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
187b0 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
187c0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
187d0 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
187e0 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
187f0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
18800 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
18810 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
18820 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
18830 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
18840 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
18850 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
18860 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
18870 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
18880 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
18890 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
188a0 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
188b0 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
188c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
188d0 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
188e0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
188f0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
18900 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
18910 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
18920 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
18930 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
18940 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
18950 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
18960 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
18970 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
18980 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
18990 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
189a0 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
189b0 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
189c0 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
189d0 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
189e0 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
189f0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
18a00 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
18a10 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
18a20 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
18a30 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
18a40 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
18a50 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
18a60 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
18a70 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
18a80 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
18a90 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  o no sync occurs
18aa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
18ab0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
18ac0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
18ad0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
18ae0 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a  edia on which.**
18af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
18b00 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73   stored, then Os
18b10 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
18b20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f  called on the jo
18b30 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49  urnal.** file. I
18b40 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
18b50 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
18b60 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68   is to update th
18b70 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a  e nRec field in.
18b80 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
18b90 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eader..**.** Thi
18ba0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
18bb0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
18bc0 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
18bd0 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
18be0 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
18bf0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
18c00 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
18c10 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
18c20 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
18c30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
18c40 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
18c50 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
18c60 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
18c70 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
18c80 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
18c90 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
18ca0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
18cb0 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
18cc0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
18cd0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
18ce0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
18cf0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
18d00 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
18d10 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
18d20 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
18d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18d40 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
18d50 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18d60 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18d70 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
18d80 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18d90 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
18da0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
18db0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
18dc0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
18dd0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
18de0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
18df0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
18e00 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
18e10 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
18e20 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
18e30 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
18e40 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
18e50 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
18e60 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
18e70 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
18e80 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
18e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
18ea0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
18eb0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
18ec0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
18ed0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
18ee0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
18ef0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
18f00 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
18f10 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
18f20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
18f30 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
18f40 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
18f50 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
18f60 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
18f70 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
18f80 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
18f90 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
18fa0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
18fb0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
18fc0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
18fd0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
18fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
18ff0 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20  64 jrnlOff;.    
19000 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19010 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
19020 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
19030 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
19040 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
19050 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
19060 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
19070 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
19080 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
19090 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
190a0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
190b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
190c0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
190d0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
190e0 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
190f0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
19100 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19110 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
19120 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
19130 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
19140 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
19150 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
19160 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
19170 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
19180 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
19190 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
191a0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
191b0 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
191c0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
191d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
191e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
191f0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
19200 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
19210 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
19220 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
19230 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
19240 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
19250 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
19260 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
19270 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
19280 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
19290 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
192a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
192b0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
192c0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
192d0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
192e0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
192f0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
19300 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
19310 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
19320 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
19330 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19340 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19350 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
19360 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
19370 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
19380 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
19390 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
193a0 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
193b0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
193c0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
193d0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
193e0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
193f0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
19400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c  ;.    }.    lruL
19410 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
19420 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
19430 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
19440 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
19450 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
19460 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
19470 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
19480 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
19490 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
194a0 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
194b0 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
194c0 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
194d0 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
194e0 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
194f0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
19500 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
19510 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
19520 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
19530 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
19540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19550 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
19560 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ed==pPager->lru.
19570 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
19580 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
19590 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
195a0 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
195b0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
195c0 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
195d0 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
195e0 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
195f0 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
19600 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
19610 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
19620 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
19630 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
19640 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
19650 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
19660 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
19670 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
19680 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
19690 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
196a0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
196b0 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
196c0 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
196d0 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
196e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
196f0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
19700 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
19710 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
19720 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
19730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19740 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
19750 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
19760 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
19770 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19780 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
19790 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
197a0 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
197b0 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
197c0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
197d0 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
197e0 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
197f0 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
19800 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
19810 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
19820 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
19830 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
19840 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
19850 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
19860 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
19870 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
19880 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
19890 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
198a0 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
198b0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
198c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
198d0 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
198e0 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
198f0 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
19900 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
19910 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
19920 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
19930 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
19940 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
19950 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
19960 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
19970 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
19980 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
19990 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
199a0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
199b0 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
199c0 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
199d0 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
199e0 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
199f0 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
19a00 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
19a10 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
19a20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
19a30 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
19a40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
19a50 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
19a60 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
19a70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19a90 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
19aa0 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
19ab0 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
19ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19ad0 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
19ae0 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
19af0 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
19b00 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
19b10 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
19b20 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
19b30 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
19b40 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
19b50 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
19b60 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
19b70 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
19b80 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
19b90 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
19ba0 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
19bb0 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
19bc0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19bd0 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
19be0 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
19bf0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
19c00 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
19c10 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
19c20 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
19c30 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
19c40 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19c50 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
19c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
19c70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
19c80 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
19c90 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
19ca0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
19cb0 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
19cc0 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
19cd0 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
19ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19cf0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
19d00 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
19d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19d20 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
19d30 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
19d40 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19d50 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  er;.  PgHdr *p;.
19d60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19d70 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
19d80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19d90 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
19da0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
19db0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
19dc0 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
19dd0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
19de0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19df0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
19e00 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
19e10 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
19e20 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
19e30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
19e40 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
19e50 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
19e60 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
19e70 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
19e80 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
19e90 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
19ea0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
19eb0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
19ec0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
19ed0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
19ee0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
19ef0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
19f00 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
19f10 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
19f20 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
19f30 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
19f40 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
19f50 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
19f60 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
19f70 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
19f80 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
19f90 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
19fa0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
19fb0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
19fc0 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
19fd0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
19fe0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
19ff0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
1a000 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1a010 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
1a020 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
1a030 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
1a040 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1a050 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
1a060 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
1a070 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1a080 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
1a090 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
1a0a0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
1a0b0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
1a0c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1a0d0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
1a0e0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
1a0f0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
1a100 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
1a110 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
1a120 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1a130 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1a140 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1a150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a160 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a170 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
1a180 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
1a190 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28  t(pList);.  for(
1a1a0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1a1b0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
1a1c0 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29  sert( p->dirty )
1a1d0 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d  ;.    p->dirty =
1a1e0 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
1a1f0 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
1a200 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1a210 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
1a220 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
1a230 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
1a240 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1a250 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
1a260 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
1a270 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
1a280 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1a290 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
1a2a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1a2b0 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
1a2c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
1a2d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1a2e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1a2f0 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
1a300 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1a310 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
1a320 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
1a330 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
1a340 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
1a350 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1a360 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
1a370 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1a380 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1a390 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1a3a0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1a3b0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1a3c0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1a3d0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1a3e0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1a3f0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
1a400 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
1a410 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1a420 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
1a430 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1a440 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1a450 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
1a460 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1a470 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
1a480 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
1a490 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47  o, 6);.      PAG
1a4a0 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20  ERTRACE4("STORE 
1a4b0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1a4c0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1a4e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
1a4f0 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
1a500 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1a510 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1a520 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e  (("PGOUT %p %d\n
1a530 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74  ", pPager, pList
1a540 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
1a550 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1a560 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1a570 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1a580 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1a590 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1a5a0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1a5b0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1a5c0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1a5d0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1a5e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
1a5f0 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
1a600 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1a610 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1a620 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
1a630 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1a640 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1a650 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
1a660 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
1a670 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1a680 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
1a690 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1a6a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
1a6b0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1a6c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
1a6d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1a6e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1a6f0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1a700 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
1a710 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1a720 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
1a730 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
1a740 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
1a750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
1a770 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
1a780 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
1a790 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
1a7a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1a7b0 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
1a7c0 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
1a7d0 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
1a7e0 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
1a7f0 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
1a800 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
1a810 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
1a820 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
1a830 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 23  ger *pPager){..#
1a840 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1a850 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 73 61  /* Verify the sa
1a860 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69 72 74  nity of the dirt
1a870 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20 61  y list when we a
1a880 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20  re running.  ** 
1a890 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f 64  in debugging mod
1a8a0 65 2e 20 20 54 68 69 73 20 69 73 20 65 78 70 65  e.  This is expe
1a8b0 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f 74  nsive, so do not
1a8c0 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f 6e  .  ** do this on
1a8d0 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1a8e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20 30   */.  int n1 = 0
1a8f0 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b 0a  ;.  int n2 = 0;.
1a900 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66 6f    PgHdr *p;.  fo
1a910 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
1a920 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
1a930 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72 74  ll){ if( p->dirt
1a940 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f  y ) n1++; }.  fo
1a950 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69 72  r(p=pPager->pDir
1a960 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  ty; p; p=p->pDir
1a970 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61  ty){ n2++; }.  a
1a980 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29 3b  ssert( n1==n2 );
1a990 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1a9a0 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  n pPager->pDirty
1a9b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a9c0 6e 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  n 1 if there is 
1a9d0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
1a9e0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
1a9f0 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
1aa00 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
1aa10 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1aa20 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
1aa30 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1aa40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1aa50 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
1aa60 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
1aa70 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
1aa80 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
1aa90 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
1aaa0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
1aab0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
1aac0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
1aad0 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
1aae0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1aaf0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1ab00 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   if unable to de
1ab10 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 74  termine the stat
1ab20 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  us of the journa
1ab30 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  l..**.** This ro
1ab40 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f  utine does not o
1ab50 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1ab60 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20  file to examine 
1ab70 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  its.** content. 
1ab80 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72   Hence, the jour
1ab90 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1aba0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1abb0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1abc0 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  l file that has 
1abd0 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e  been deleted, an
1abe0 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20 68  d hence not be h
1abf0 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68  ot.  Or.** the h
1ac00 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
1ac10 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a 65  rnal might be ze
1ac20 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20  roed out.  This 
1ac30 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20  routine.** does 
1ac40 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68 65  not discover the
1ac50 73 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e 6f  se cases of a no
1ac60 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20  n-hot journal - 
1ac70 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  if the.** journa
1ac80 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1ac90 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 74  d is not empty t
1aca0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75  his routine assu
1acb0 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74  mes it.** is hot
1acc0 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  .  The pager_pla
1acd0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1ace0 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
1acf0 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  at the.** journa
1ad00 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
1ad10 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69 6c  ally hot and wil
1ad20 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  l no-op..*/.stat
1ad30 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
1ad40 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1ad50 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
1ad60 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1ad70 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
1ad80 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
1ad90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1ada0 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
1adb0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1adc0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
1add0 65 78 69 73 74 73 3b 0a 20 20 20 20 69 6e 74 20  exists;.    int 
1ade0 6c 6f 63 6b 65 64 3b 0a 0a 20 20 20 20 72 63 20  locked;..    rc 
1adf0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1ae00 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
1ae10 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
1ae20 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1ae30 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
1ae40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ae50 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
1ae60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ae70 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
1ae80 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
1ae90 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 7d 0a 0a  locked);.    }..
1aea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aeb0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
1aec0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
1aed0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
1aee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1aef0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1af00 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1af10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1af20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 67  QLITE_OK && nPag
1af30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1af40 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1af50 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1af60 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
1af70 20 20 20 20 65 78 69 73 74 73 20 3d 20 30 3b 0a      exists = 0;.
1af80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1af90 20 20 20 72 65 73 20 3d 20 28 72 63 21 3d 53 51     res = (rc!=SQ
1afa0 4c 49 54 45 5f 4f 4b 20 3f 20 2d 31 20 3a 20 28  LITE_OK ? -1 : (
1afb0 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63 6b 65  exists && !locke
1afc0 64 29 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  d));.  }..  retu
1afd0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1afe0 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
1aff0 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
1b000 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
1b010 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
1b020 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
1b030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b040 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
1b050 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
1b060 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
1b070 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
1b080 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
1b090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b0a0 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
1b0b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1b0c0 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64   **ppPg){.  PgHd
1b0d0 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20  r *pPg;.  *ppPg 
1b0e0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  = 0;..  /* It is
1b0f0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
1b100 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
1b110 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
1b120 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e  object.  ** poin
1b130 74 65 64 20 74 6f 20 62 79 20 70 50 61 67 65 72  ted to by pPager
1b140 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   has at least on
1b150 65 20 66 72 65 65 20 70 61 67 65 20 28 70 61 67  e free page (pag
1b160 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e  e with nRef==0).
1b170 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
1b180 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72  !MEMDB);.  asser
1b190 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
1b1a0 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  irst);..  /* Fin
1b1b0 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
1b1c0 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
1b1d0 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
1b1e0 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65  does not.  ** re
1b1f0 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
1b200 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
1b210 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
1b220 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
1b230 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  ru.pFirstSynced;
1b240 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75  ..  /* If we cou
1b250 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
1b260 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
1b270 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
1b280 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  c().  ** on the 
1b290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1b2a0 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
1b2b0 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
1b2c0 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73  is a.  ** very s
1b2d0 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
1b2e0 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
1b2f0 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
1b300 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20   sometimes.  ** 
1b310 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
1b320 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1b330 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  Pg==0 && pPager-
1b340 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 7b 0a 20  >lru.pFirst ){. 
1b350 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1b360 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1b370 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1b380 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1b390 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1b3a0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 6e 74  ->fd);.      int
1b3b0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
1b3c0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1b3d0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1b3e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b400 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
1b410 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
1b420 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1b430 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1b440 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c      /* If in ful
1b450 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69  l-sync mode, wri
1b460 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c  te a new journal
1b470 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65   header into the
1b480 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
1b490 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
1b4a0 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20  s done to avoid 
1b4b0 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61  ever modifying a
1b4c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1b4d0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
1b4e0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
1b4f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
1b500 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
1b510 20 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64         ** alread
1b520 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1b530 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
1b540 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
1b550 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  er is.        **
1b560 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
1b570 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
1b580 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
1b590 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 61    */.        pPa
1b5a0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1b5b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b5c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b5d0 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 20  f > 0 );.       
1b5e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b5f0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
1b600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
1b610 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1b620 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
1b630 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b640 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b660 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
1b670 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70   = pPager->lru.p
1b680 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73  First;.  }..  as
1b690 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
1b6a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1b6b0 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
1b6c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b6d0 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
1b6e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
1b6f0 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72  dirty && !pPager
1b700 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1b710 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
1b720 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
1b730 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
1b740 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1b750 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1b760 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1b770 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1b780 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1b790 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
1b7a0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1b7b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b7c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b7d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b7e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1b7f0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 7c 7c 20 70  g->dirty==0 || p
1b800 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1b810 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
1b820 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
1b830 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
1b840 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
1b850 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20  , then.  ** set 
1b860 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
1b870 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
1b880 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
1b890 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  he.  ** sqlite3P
1b8a0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1b8b0 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
1b8c0 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
1b8d0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1b8e0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63  ..  ** It is nec
1b8f0 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
1b900 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
1b910 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
1b920 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69  Rollback.  ** mi
1b930 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
1b940 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
1b950 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
1b960 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
1b970 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ber.  ** that is
1b980 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
1b990 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
1b9a0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
1b9b0 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a   pages must.  **
1b9c0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
1b9d0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
1b9e0 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
1b9f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61   */.  if( pPg->a
1ba00 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1ba10 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41  .    IOTRACE(("A
1ba20 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25  LWAYS_ROLLBACK %
1ba30 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1ba40 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
1ba50 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1ba60 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1ba70 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
1ba80 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
1ba90 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
1baa0 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  le.  */.  unlink
1bab0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73  Page(pPg);.  ass
1bac0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
1bad0 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  0 );..  *ppPg = 
1bae0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1baf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1bb00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1bb10 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1bb20 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  NT./*.** This fu
1bb30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1bb40 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
1bb50 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
1bb60 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
1bb70 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
1bb80 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
1bb90 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1bba0 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
1bbb0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
1bbc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
1bbd0 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
1bbe0 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a  e3_free()ed..**.
1bbf0 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e  ** nReq is the n
1bc00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1bc10 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
1bc20 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63  d. Once this muc
1bc30 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65  h has.** been re
1bc40 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63  leased, the func
1bc50 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68  tion returns. Th
1bc60 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1bc70 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
1bc80 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  er .** of bytes 
1bc90 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
1bca0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1bcb0 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65  e3PagerReleaseMe
1bcc0 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
1bcd0 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
1bce0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1bcf0 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   Bytes of memory
1bd00 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72   released so far
1bd10 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
1bd20 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1bd30 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1bd40 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a   over pagers */.
1bd50 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 73    BusyHandler *s
1bd60 61 76 65 64 42 75 73 79 3b 20 20 20 20 20 2f 2a  avedBusy;     /*
1bd70 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66 20 74   Saved copy of t
1bd80 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1bd90 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1bda0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41  LITE_OK;..  /* A
1bdb0 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72  cquire the memor
1bdc0 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74  y-management mut
1bdd0 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ex.  */.#ifndef 
1bde0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f  SQLITE_MUTEX_NOO
1bdf0 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  P.  sqlite3_mute
1be00 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20  x *mutex;       
1be10 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65  /* The MEM2 mute
1be20 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73  x */.  mutex = s
1be30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
1be40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1be50 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
1be60 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1be70 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
1be80 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20  );..  /* Signal 
1be90 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
1bea0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65  nections that me
1beb0 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1bec0 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61  wants.  ** to ha
1bed0 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ve access to the
1bee0 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   pagers..  */.  
1bef0 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74  for(pPager=sqlit
1bf00 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61  e3PagerList; pPa
1bf10 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67  ger; pPager=pPag
1bf20 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1bf30 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
1bf40 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  M = 1;.  }..  wh
1bf50 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1bf60 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  OK && (nReq<0 ||
1bf70 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
1bf80 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1bf90 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  Pg;.    PgHdr *p
1bfa0 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20  Recycled;. .    
1bfb0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
1bfc0 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
1bfd0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1bfe0 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1bff0 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   If.    ** this 
1c000 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1c010 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 64   find one that d
1c020 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73 79  oes require a sy
1c030 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nc()..    */.   
1c040 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c050 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
1c060 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1c070 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
1c080 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  ));.    pPg = sq
1c090 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
1c0a0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20  .pFirstSynced;. 
1c0b0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
1c0c0 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20   (pPg->needSync 
1c0d0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
1c0e0 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20  iInUseDB) ){.   
1c0f0 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1c100 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ree.pNext;.    }
1c110 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 7b  .    if( !pPg ){
1c120 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
1c130 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
1c140 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68  pFirst;.      wh
1c150 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67 2d  ile( pPg && pPg-
1c160 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44  >pPager->iInUseD
1c170 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  B ){.        pPg
1c180 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e   = pPg->gfree.pN
1c190 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1c1a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
1c1b0 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1c1c0 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1c1d0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1c1e0 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f  IC_LRU));..    /
1c1f0 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74 68 65  * If pPg==0, the
1c200 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
1c210 65 20 68 61 73 20 66 61 69 6c 65 64 20 74 6f 20  e has failed to 
1c220 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 0a 20  find a page to. 
1c230 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49     ** recycle. I
1c240 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74 75  n this case retu
1c250 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75  rn early - no fu
1c260 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c  rther memory wil
1c270 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c 65  l.    ** be rele
1c280 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ased..    */.   
1c290 20 69 66 28 20 21 70 50 67 20 29 20 62 72 65 61   if( !pPg ) brea
1c2a0 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 20 3d  k;..    pPager =
1c2b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c2c0 20 20 61 73 73 65 72 74 28 21 70 50 67 2d 3e 6e    assert(!pPg->n
1c2d0 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d  eedSync || pPg==
1c2e0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1c2f0 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  st);.    assert(
1c300 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1c310 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1c320 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  u.pFirstSynced);
1c330 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42 75 73  .  .    savedBus
1c340 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73  y = pPager->pBus
1c350 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50  yHandler;.    pP
1c360 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1c370 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  er = 0;.    rc =
1c380 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1c390 50 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65  Pager, &pRecycle
1c3a0 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
1c3b0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 73  pBusyHandler = s
1c3c0 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20 61 73  avedBusy;.    as
1c3d0 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d  sert(pRecycled==
1c3e0 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  pPg || rc!=SQLIT
1c3f0 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  E_OK);.    if( r
1c400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c410 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
1c420 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
1c430 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
1c440 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
1c450 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  been .      ** r
1c460 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1c470 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
1c480 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
1c490 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
1c4a0 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
1c4b0 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
1c4c0 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
1c4d0 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
1c4e0 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
1c4f0 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
1c500 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
1c510 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1c520 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
1c530 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
1c540 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
1c550 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
1c560 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61   .      ** proba
1c570 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20  bly is though.. 
1c580 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
1c590 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
1c5a0 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
1c5b0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
1c5c0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1c5d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c5e0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
1c5f0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tAll;.      }els
1c600 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e{.        for( 
1c610 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pTmp=pPager->pAl
1c620 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
1c630 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
1c640 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
1c650 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
1c660 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
1c670 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  extAll;.      }.
1c680 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1c690 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1c6a0 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1c6b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1c6c0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1c6d0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1c6e0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1c6f0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1c700 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1c710 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1c720 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1c730 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1c740 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1c750 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1c760 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1c770 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1c780 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c790 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
1c7a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c7b0 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
1c7c0 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
1c7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1c7e0 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
1c7f0 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
1c800 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1c810 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a  file or .      *
1c820 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
1c830 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
1c840 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
1c850 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
1c860 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
1c870 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1c880 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
1c890 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
1c8a0 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
1c8b0 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
1c8c0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
1c8d0 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
1c8e0 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
1c8f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  e .      ** of a
1c900 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
1c910 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
1c920 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1c930 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
1c940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
1c950 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
1c960 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
1c970 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20  E_IOERR ||.     
1c980 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1c990 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  FULL ||.        
1c9a0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53    rc==SQLITE_BUS
1c9b0 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  Y.      );.     
1c9c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c9d0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1c9e0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
1c9f0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1ca00 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
1ca10 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74   }..  /* Clear t
1ca20 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
1ca30 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72  ment flags and r
1ca40 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1ca50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1ca60 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1ca70 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1ca80 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1ca90 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1caa0 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
1cab0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1cac0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
1cad0 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1cae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1caf0 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a  s released.  */.
1cb00 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
1cb10 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
1cb20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1cb30 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
1cb40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
1cb50 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1cb60 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1cb70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1cb90 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
1cba0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1cbb0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
1cbc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
1cbd0 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
1cbe0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
1cbf0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1cc00 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
1cc10 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1cc20 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1cc30 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1cc40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cc50 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1cc60 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
1cc70 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1cc80 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1cc90 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1cca0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1ccb0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
1ccc0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1ccd0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1cce0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1ccf0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1cd00 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1cd10 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1cd20 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1cd30 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1cd40 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1cd50 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  o));.  if( pgno=
1cd60 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 ){.    memcpy
1cd70 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1cd80 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48  Vers, &((u8*)PGH
1cd90 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
1cda0 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
1cde0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1cdf0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1ce00 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
1ce10 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
1ce20 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52  gno, 3);.  PAGER
1ce30 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64  TRACE4("FETCH %d
1ce40 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ce50 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1ce60 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1ce70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1ce80 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1ce90 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72  h(pPg));.  retur
1cea0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1ceb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cec0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1ced0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
1cee0 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
1cef0 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
1cf00 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
1cf10 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
1cf20 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
1cf30 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
1cf40 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
1cf50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1cf60 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
1cf70 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
1cf80 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
1cf90 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
1cfa0 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
1cfb0 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
1cfc0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1cfd0 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
1cfe0 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
1cff0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
1d000 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
1d010 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
1d020 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1d030 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
1d040 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d050 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d060 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b    int isHot = 0;
1d070 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
1d080 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
1d090 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
1d0a0 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
1d0b0 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
1d0c0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
1d0d0 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
1d0e0 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
1d0f0 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  s the chance to 
1d100 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
1d110 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
1d120 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1d130 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
1d140 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
1d150 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
1d160 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
1d170 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
1d180 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1d190 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1d1a0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
1d1b0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
1d1c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
1d1d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d1e0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
1d1f0 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Hot = 1;.    }. 
1d200 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
1d210 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
1d220 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1d230 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
1d240 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
1d250 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65  is still in an e
1d260 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1d270 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20  ot proceed. The 
1d280 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74  error .  ** stat
1d290 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  e will be cleare
1d2a0 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
1d2b0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68  in the future wh
1d2c0 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a  en all page .  *
1d2d0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65  * references are
1d2e0 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65   dropped and the
1d2f0 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
1d300 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20  scarded..  */.  
1d310 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d320 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1d330 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1d340 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1d350 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1d360 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  e;.  }..  if( pP
1d370 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1d380 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48  ER_UNLOCK || isH
1d390 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ot ){.    sqlite
1d3a0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1d3b0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
1d3c0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1d3d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d3e0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
1d3f0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1d400 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
1d410 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1d420 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1d430 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
1d440 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1d450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1d470 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1d480 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1d490 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
1d4a0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1d4b0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1d4c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d4d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d4e0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1d4f0 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
1d500 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  .      /* If a j
1d510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
1d520 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
1d530 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
1d540 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  k on the.      *
1d550 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
1d560 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
1d570 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
1d580 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
1d590 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1d5a0 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
1d5b0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1d5c0 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b       if( rc<0 ){
1d5d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d5e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1d5f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
1d600 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
1d610 20 20 20 20 20 69 66 28 20 72 63 3d 3d 31 20 7c       if( rc==1 |
1d620 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20  | isHot ){.     
1d630 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
1d640 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1d650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d660 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1d670 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
1d680 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1d690 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1d6a0 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
1d6b0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
1d6c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43  e.        ** EXC
1d6d0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
1d6e0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
1d6f0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
1d700 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  pen the.        
1d710 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1d720 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
1d730 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
1d740 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
1d750 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1d760 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
1d770 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
1d780 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
1d790 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
1d7a0 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
1d7b0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1d7c0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
1d7d0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
1d7e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1d7f0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
1d800 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  he.        ** se
1d810 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
1d820 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
1d830 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
1d840 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
1d850 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
1d860 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
1d870 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d880 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
1d890 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1d8a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1d8b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1d8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1d8d0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1d8e0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
1d8f0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
1d900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d920 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1d930 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1d940 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rc);.           
1d950 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
1d960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d970 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1d980 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1d990 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IVE;.        }. 
1d9a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
1d9b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1d9c0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
1d9d0 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
1d9e0 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20  use in .        
1d9f0 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
1da00 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
1da10 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
1da20 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
1da30 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
1da40 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
1da50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
1da60 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
1da70 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
1da80 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
1da90 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
1daa0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1dab0 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
1dac0 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
1dad0 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
1dae0 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
1daf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1db00 28 20 21 69 73 48 6f 74 20 26 26 20 70 50 61 67  ( !isHot && pPag
1db10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1db20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1db30 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
1db40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1db50 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61  sAccess(pVfs,pPa
1db60 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51  ger->zJournal,SQ
1db70 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1db80 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20  TS,&res);.      
1db90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dbb0 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1dbd0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
1dbe0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
1dbf0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1dc00 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1dc10 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1dc20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dc30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1dc40 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1dc50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1dc60 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1dc70 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1dc80 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1dc90 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1dcb0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
1dcc0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
1dcd0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1dcf0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1dd00 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
1dd20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1dd40 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1dd50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
1dd60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
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 20 20 20 20 2f 2a 20               /* 
1dd90 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
1dda0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
1ddb0 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f  hat means some o
1ddc0 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20  ther process.   
1ddd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1dde0 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64  s already rolled
1ddf0 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20   it back */.    
1de00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1de10 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1de20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1de30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1de40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1de50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1de60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1de70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72  QLITE_NOMEM && r
1de80 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1de90 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 20  UNLOCK .        
1dea0 20 20 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45     && rc!=SQLITE
1deb0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 0a 20 20  _IOERR_NOMEM .  
1dec0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1ded0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1dee0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1def0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
1df00 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1df10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1df20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1df30 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
1df40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1df50 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
1df60 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1df70 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
1df80 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
1df90 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
1dfa0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1dfb0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
1dfc0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
1dfd0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
1dfe0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
1dff0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
1e000 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
1e010 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
1e020 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
1e030 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e040 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1e050 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
1e060 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1e070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e080 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1e090 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1e0a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
1e0b0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1e0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1e0d0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
1e0e0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1e0f0 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
1e100 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
1e110 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
1e120 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
1e130 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
1e140 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1e150 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1e160 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
1e170 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
1e180 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
1e190 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
1e1a0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
1e1b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
1e1c0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
1e1d0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1e1e0 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
1e1f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
1e200 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1e210 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
1e220 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
1e230 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
1e240 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
1e250 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
1e260 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
1e270 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
1e280 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
1e290 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1e2a0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
1e2b0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
1e2c0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
1e2d0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
1e2e0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
1e2f0 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
1e300 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
1e310 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
1e320 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
1e330 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
1e340 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
1e350 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
1e360 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
1e370 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
1e380 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
1e390 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
1e3a0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
1e3b0 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
1e3c0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
1e3d0 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
1e3e0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
1e3f0 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
1e400 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
1e410 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
1e420 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
1e430 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1e440 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1e450 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1e460 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1e470 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
1e480 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
1e490 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1e4a0 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
1e4b0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
1e4c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e4d0 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
1e4e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1e4f0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20  t(pPager, 0);.. 
1e500 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1e510 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1e520 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
1e530 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1e540 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1e550 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  led;.        }..
1e560 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1e570 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
1e580 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1e590 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
1e5a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
1e5b0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1e5c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1e5d0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1e5e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
1e5f0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1e600 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
1e610 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e630 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1e640 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1e650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
1e670 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
1e680 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
1e690 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1e6a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1e6b0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
1e6c0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1e6d0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1e6e0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
1e6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1e700 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1e710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e720 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1e730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
1e740 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1e750 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
1e760 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1e770 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1e780 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1e790 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1e7a0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1e7b0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
1e7c0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
1e7d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e7e0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
1e7f0 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
1e800 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
1e810 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
1e820 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
1e830 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
1e840 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1e850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e860 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e870 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20  a PgHdr object. 
1e880 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20    Either create 
1e890 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75  a new one or reu
1e8a0 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  se.** an existin
1e8b0 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  g one that is no
1e8c0 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  t otherwise in u
1e8d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  se..**.** A new 
1e8e0 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20  PgHdr structure 
1e8f0 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e  is created if an
1e900 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1e910 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a  ng are.** true:.
1e920 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1e930 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65  e have not excee
1e940 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20  ded our maximum 
1e950 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20  allocated cache 
1e960 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
1e970 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22   as set by the "
1e980 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1e990 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  e" command..**.*
1e9a0 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
1e9b0 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50   are no unused P
1e9c0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61  gHdr objects ava
1e9d0 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74  ilable at this t
1e9e0 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ime..**.**     (
1e9f0 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69  3)  This is an i
1ea00 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ea10 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29  e..**.**     (4)
1ea20 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50    There are no P
1ea30 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61  gHdr objects tha
1ea40 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  t do not require
1ea50 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20   a journal.**   
1ea60 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63         file sync
1ea70 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74   and a sync of t
1ea80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ea90 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1eaa0 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69           prohibi
1eab0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ted..**.** Other
1eac0 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65  wise, reuse an e
1ead0 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20  xisting PgHdr.  
1eae0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1eaf0 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73  reuse an.** exis
1eb00 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c  ting PgHdr if al
1eb10 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1eb20 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1eb30 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
1eb40 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65  ave reached or e
1eb50 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69  xceeded the maxi
1eb60 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  mum cache size.*
1eb70 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77  *          allow
1eb80 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61  ed by "PRAGMA ca
1eb90 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a  che_size"..**.**
1eba0 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1ebb0 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c  is a PgHdr avail
1ebc0 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d  able with PgHdr-
1ebd0 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20  >nRef==0.**.**  
1ebe0 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e     (3)  We are n
1ebf0 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ot in an in-memo
1ec00 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  ry database.**.*
1ec10 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65  *     (4)  Eithe
1ec20 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76  r there is an av
1ec30 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68  ailable PgHdr th
1ec40 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1ec50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20  .**          to 
1ec60 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  be synced to dis
1ec70 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73  k or else disk s
1ec80 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e  yncing is curren
1ec90 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  tly.**          
1eca0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74  allowed..*/.stat
1ecb0 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f  ic int pagerAllo
1ecc0 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a  catePage(Pager *
1ecd0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a  pPager, PgHdr **
1ece0 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  ppPg){.  int rc 
1ecf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1ed00 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
1ed10 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a   nByteHdr;..  /*
1ed20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67   Create a new Pg
1ed30 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68  Hdr if any of th
1ed40 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e  e four condition
1ed50 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20  s defined .  ** 
1ed60 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a  above are met: *
1ed70 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1ed80 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
1ed90 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65  Page.   || pPage
1eda0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30  r->lru.pFirst==0
1edb0 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20   .   || MEMDB.  
1edc0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75   || (pPager->lru
1edd0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  .pFirstSynced==0
1ede0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
1edf0 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20  tSync).  ){.    
1ee00 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
1ee10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
1ee20 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73  ge>=pPager->nHas
1ee30 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  h ){.      pager
1ee40 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
1ee50 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20  le(pPager,.     
1ee60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73      pPager->nHas
1ee70 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50  h<256 ? 256 : pP
1ee80 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a  ager->nHash*2);.
1ee90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1eea0 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->nHash==0 ){.  
1eeb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eec0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1eed0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
1eee0 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  cate_out;.      
1eef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
1ef00 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1ef10 20 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73      nByteHdr = s
1ef20 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69  izeof(*pPg) + si
1ef30 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
1ef40 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
1ef50 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
1ef60 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
1ef70 79 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  y);.    pPg = sq
1ef80 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79  lite3Malloc( nBy
1ef90 74 65 48 64 72 20 29 3b 0a 20 20 20 20 69 66 28  teHdr );.    if(
1efa0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 44   pPg ){.      pD
1efb0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ata = sqlite3Mal
1efc0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67  loc( pPager->pag
1efd0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
1efe0 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20  f( pData==0 ){. 
1eff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1f000 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
1f010 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20    pPg = 0;.     
1f020 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
1f030 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1f040 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
1f050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1f060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f070 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1f080 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1f090 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
1f0a0 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20   0, nByteHdr);. 
1f0b0 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20     pPg->pData = 
1f0c0 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d 3e  pData;.    pPg->
1f0d0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
1f0e0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
1f0f0 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
1f100 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
1f110 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
1f120 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
1f130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f140 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
1f150 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
1f160 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
1f170 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1f180 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1f190 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1f1a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1f1b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f1c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
1f1d0 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KED;.    }.    i
1f1e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f1f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1f200 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1f210 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
1f220 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1f230 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1f240 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
1f250 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
1f260 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
1f270 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
1f280 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f290 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1f2a0 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ave the content 
1f2b0 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
1f2c0 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
1f2d0 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
1f2e0 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
1f2f0 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  nt==1, then the 
1f300 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a  content was.** j
1f310 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ust initialized 
1f320 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64  to zeros instead
1f330 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
1f340 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74  rom disk..** But
1f350 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65   now we need the
1f360 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f   real data off o
1f370 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65  f disk.  So make
1f380 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65   sure we.** have
1f390 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e   it.  Read it in
1f3a0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   if we do not ha
1f3b0 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a  ve it already..*
1f3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f3d0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50  er_get_content(P
1f3e0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
1f3f0 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20  ( pPg->needRead 
1f400 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
1f410 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
1f420 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
1f430 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
1f440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f450 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
1f460 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1f470 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1f480 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1f490 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f4a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1f4b0 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
1f4c0 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
1f4d0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
1f4e0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
1f4f0 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
1f500 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
1f510 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
1f520 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
1f530 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1f540 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
1f550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1f560 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
1f570 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
1f580 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
1f590 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1f5a0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
1f5b0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1f5c0 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
1f5d0 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
1f5e0 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
1f5f0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
1f600 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
1f610 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
1f620 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
1f630 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
1f640 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
1f650 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
1f660 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
1f670 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
1f680 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
1f690 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
1f6a0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
1f6b0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
1f6c0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
1f6d0 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
1f6e0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
1f6f0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1f700 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1f710 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1f720 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
1f730 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1f740 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
1f750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1f760 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
1f770 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
1f780 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
1f790 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
1f7a0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
1f7b0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1f7c0 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
1f7d0 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
1f7e0 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
1f7f0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
1f800 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
1f810 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
1f820 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
1f830 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
1f840 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
1f850 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
1f860 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
1f870 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
1f880 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
1f890 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
1f8a0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
1f8b0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
1f8c0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
1f8d0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
1f8e0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
1f8f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  es..**.** If noC
1f900 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  ontent is false,
1f910 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1f920 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
1f930 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1f940 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1f950 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
1f960 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
1f970 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1f980 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
1f990 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
1f9a0 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  time, so do not 
1f9b0 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20  do a disk read. 
1f9c0 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
1f9d0 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e  e.** page conten
1f9e0 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42  t with zeros.  B
1f9f0 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74  ut mark the fact
1fa00 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
1fa10 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f  t read the.** co
1fa20 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67  ntent by setting
1fa30 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1fa40 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72  ead flag.  Later
1fa50 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69   on, if .** sqli
1fa60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1fa70 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  is called on thi
1fa80 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69  s page or if thi
1fa90 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
1faa0 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74  called again wit
1fab0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20  h noContent==0, 
1fac0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1fad0 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  the content is n
1fae0 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  eeded.** and the
1faf0 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c   disk read shoul
1fb00 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
1fb10 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1fb20 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
1fb30 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1fb40 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1fb50 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1fb60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fb70 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1fb80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1fb90 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1fba0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1fbb0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1fbc0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1fbd0 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1fbe0 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1fbf0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1fc00 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1fc10 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1fc20 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1fc30 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1fc40 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1fc50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1fc60 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
1fc70 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
1fc80 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
1fc90 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
1fca0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1fcb0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
1fcc0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
1fcd0 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
1fce0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1fcf0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
1fd00 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
1fd10 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
1fd20 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
1fd30 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
1fd40 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1fd50 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1fd60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1fd70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
1fd80 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1fd90 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
1fda0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
1fdb0 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
1fdc0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1fdd0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  *ppPage = 0;..  
1fde0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1fdf0 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
1fe00 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
1fe10 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
1fe20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
1fe30 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
1fe40 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
1fe50 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
1fe60 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
1fe70 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
1fe80 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1fe90 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
1fea0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
1feb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1fed0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fee0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1fef0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d  LOCK );..  pPg =
1ff00 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1ff10 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
1ff20 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1ff30 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1ff40 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
1ff50 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1ff60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
1ff70 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  ;.    int h;.   
1ff80 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1ff90 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
1ffa0 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61  rc = pagerAlloca
1ffb0 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20 26  tePage(pPager, &
1ffc0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1ffd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ffe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fff0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
20000 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
20010 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
20020 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  || pgno>pPager->
20030 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  stmtSize );.    
20040 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
20050 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
20060 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
20070 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
20080 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
20090 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65 43 6c  = 0;..    makeCl
200a0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
200b0 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20 20  g->nRef = 1;..  
200c0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
200d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
200e0 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
200f0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
20100 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
20110 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
20120 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
20130 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
20140 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20150 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b  (pPager, &nMax);
20160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20180 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20190 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
201a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
201b0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
201c0 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61  the page with da
201d0 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65  ta, either by re
201e0 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
201f0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
20200 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69  ile, or by setti
20210 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
20220 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ge to zero..    
20230 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  */.    if( nMax<
20240 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
20250 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74  DB || (noContent
20260 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77   && !pPager->alw
20270 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a  aysRollback) ){.
20280 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
20290 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
202a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
202b0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
202c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
202d0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
202e0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
202f0 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
20300 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
20310 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
20320 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
20330 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21  = noContent && !
20340 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
20350 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f  llback;.      IO
20360 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
20370 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
20380 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
20390 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
203a0 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
203b0 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
203c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
203d0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
203e0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
203f0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
20400 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
20410 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20420 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
20430 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
20450 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
20460 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
20470 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
20480 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
20490 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
204a0 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
204b0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
204c0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
204d0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
204e0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
204f0 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
20500 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
20510 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
20520 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
20530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
20540 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
20550 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
20560 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
20570 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
20580 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
20590 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
205a0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
205b0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
205c0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
205d0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
205e0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
205f0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
20600 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
20610 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
20620 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
20630 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
20640 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
20650 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
20660 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
20670 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
20680 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
20690 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
206a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
206b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
206c0 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
206d0 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
206e0 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
206f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
20700 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
20710 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
20720 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
20730 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
20740 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20750 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
20760 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
20770 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
20780 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
20790 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
207a0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
207b0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
207c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
207d0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
207e0 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
207f0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
20800 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
20810 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
20820 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
20830 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
20840 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
20850 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  pgno, ppPage, no
20860 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65  Content);.  page
20870 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20890 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
208a0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
208b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
208c0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
208d0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
208e0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
208f0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
20900 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
20910 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
20920 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
20930 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
20940 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
20950 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
20960 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
20970 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
20980 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
20990 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
209a0 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
209b0 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
209c0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
209d0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
209e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
209f0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
20a00 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
20a10 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
20a20 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
20a30 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
20a40 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
20a50 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
20a60 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
20a70 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
20a80 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
20a90 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
20aa0 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  *pPg = 0;..  ass
20ab0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
20ac0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
20ad0 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45  !=0 );..  pagerE
20ae0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
20af0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20b00 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
20b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
20b20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
20b30 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
20b40 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65  eMode );.  }else
20b50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20b60 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
20b70 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
20b80 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44  FULL ){.    /* D
20b90 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
20ba0 65 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20  else if( (pPg = 
20bb0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
20bc0 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29  ger, pgno))!=0 )
20bd0 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  {.    page_ref(p
20be0 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
20bf0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20c00 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
20c10 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
20c20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
20c30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
20c40 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
20c50 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
20c60 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
20c70 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
20c80 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
20c90 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
20ca0 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
20cb0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
20cc0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
20cd0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
20ce0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20cf0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
20d00 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20d10 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
20d20 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
20d30 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 67  ager;..  if( pPg
20d40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
20d50 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
20d60 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
20d70 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
20d80 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
20d90 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
20da0 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
20db0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
20dc0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
20dd0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  ->pPager);.  pPg
20de0 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45  ->nRef--;..  CHE
20df0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
20e00 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
20e10 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
20e20 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
20e30 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
20e40 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
20e50 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
20e60 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
20e70 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
20e80 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  nRef==0 ){..    
20e90 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
20ea0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20eb0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
20ec0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
20ed0 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
20ee0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20ef0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
20f00 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
20f10 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
20f20 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
20f30 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
20f40 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
20f50 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
20f60 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
20f70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20f80 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
20f90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20fa0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
20fb0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
20fc0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
20fd0 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
20fe0 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
20ff0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
21000 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
21010 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
21020 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
21030 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21040 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
21050 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
21060 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
21070 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
21080 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
21090 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
210a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
210b0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
210c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
210d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
210e0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
210f0 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
21100 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
21110 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
21120 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
21130 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
21140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21150 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
21160 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
21170 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
21180 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
21190 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  >pVfs;.  int fla
211a0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
211b0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
211c0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
211d0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
211e0 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63  EATE);..  int rc
211f0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
21200 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
21210 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
21220 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
21230 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21240 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
21250 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21260 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
21270 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
21280 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
21290 65 72 2c 20 30 29 3b 0a 20 20 70 61 67 65 72 4c  er, 0);.  pagerL
212a0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
212b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
212c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
212d0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
212e0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65  >dbSize);.  page
212f0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
21300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
21310 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
21320 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21330 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
21340 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
21350 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  urnal;.  }..  if
21360 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21370 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  lOpen==0 ){.    
21380 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
21390 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c  File ){.      fl
213a0 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
213b0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
213c0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
213d0 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
213e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c   }else{.      fl
213f0 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
21400 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
21410 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
21420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
21430 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72  OMIC_WRITE.    r
21440 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
21450 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
21460 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
21470 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
21480 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
21490 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
214a0 72 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  r).    );.#else.
214b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
214c0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
214d0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
214e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
214f0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
21500 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21510 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
21520 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
21530 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
21540 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
21550 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
21560 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
21570 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
21580 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
21590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
215a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
215b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
215c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
215d0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
215e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
215f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21600 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
21610 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
21620 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
21630 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
21640 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
21650 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
21660 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
21670 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
21680 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
21690 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
216a0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
216b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
216c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
216d0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
216e0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
216f0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
21700 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
21710 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
21720 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
21730 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
21740 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
21750 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
21760 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
21770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21780 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21790 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
217a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
217b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
217c0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
217d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
217e0 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
217f0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
21800 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
21810 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21830 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21840 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
21850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
21860 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
21870 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
21880 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
21890 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
218a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
218b0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
218c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
218d0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
218e0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
218f0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
21900 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
21910 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
21920 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
21930 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
21940 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
21950 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
21960 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
21970 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
21980 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
21990 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
219a0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
219b0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
219c0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
219d0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
219e0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
219f0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
21a00 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
21a10 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
21a20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
21a30 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
21a40 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
21a50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21a60 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
21a70 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
21a80 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
21a90 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
21aa0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
21ab0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
21ac0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
21ad0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
21ae0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
21af0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21b00 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
21b10 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
21b20 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
21b30 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
21b40 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
21b50 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
21b60 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
21b70 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21b80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
21b90 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
21ba0 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
21bb0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
21bc0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
21bd0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
21be0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
21bf0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
21c00 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
21c10 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
21c20 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
21c30 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
21c40 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
21c50 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
21c60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
21c70 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
21c80 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
21c90 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
21ca0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
21cb0 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
21cc0 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
21cd0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
21ce0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
21cf0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
21d00 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
21d10 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
21d20 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
21d30 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
21d40 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
21d50 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
21d60 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
21d70 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
21d80 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
21d90 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
21da0 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
21db0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
21dc0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
21dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21de0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
21df0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
21e00 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
21e10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21e20 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
21e30 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
21e40 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
21e50 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
21e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21e70 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
21e80 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
21e90 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
21ea0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
21eb0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
21ec0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
21ed0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
21ee0 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
21ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21f00 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
21f10 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
21f20 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
21f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21f40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21f50 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
21f60 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
21f70 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
21f80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
21f90 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
21fa0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
21fb0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
21fc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
21fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  OK ){.        pa
21ff0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
22000 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22010 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
22020 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22030 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
22040 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
22050 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
22060 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
22080 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
22090 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
220a0 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  File.           
220b0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
220c0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
220d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
220e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
220f0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
22100 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
22110 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
22120 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
22130 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
22140 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
22150 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
22160 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
22170 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
22180 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
22190 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
221a0 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
221b0 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
221c0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
221d0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
221e0 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
221f0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
22200 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
22210 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
22220 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
22230 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
22240 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
22250 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
22260 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
22270 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
22280 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
22290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
222a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
222b0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
222c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
222d0 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
222e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
222f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
22300 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
22310 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
22320 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 61 67 65  er, 0);.    page
22330 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
22340 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
22350 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
22360 42 69 74 76 65 63 43 72 65 61 74 65 28 20 70 50  BitvecCreate( pP
22370 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
22380 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70      pagerEnter(p
22390 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
223a0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
223b0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
223c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
223d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
223e0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
223f0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
22400 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
22410 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
22420 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
22430 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
22440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22450 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
22460 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
22470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
22480 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
22490 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
224a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
224b0 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
224c0 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
224d0 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
224e0 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
224f0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
22500 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
22510 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
22520 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  if( pPg->dirty==
22530 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
22540 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
22550 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64  ager;.    pPg->d
22560 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
22570 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
22580 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  er->pDirty;.    
22590 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72  if( pPager->pDir
225a0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ty ){.      pPag
225b0 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  er->pDirty->pPre
225c0 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  vDirty = pPg;.  
225d0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72    }.    pPg->pPr
225e0 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  evDirty = 0;.   
225f0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
22600 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
22610 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
22620 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74  clean.  Clear it
22630 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20  s dirty bit and 
22640 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
22650 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
22660 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
22670 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
22680 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
22690 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
226a0 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
226b0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67  = 0;.    if( pPg
226c0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
226d0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
226e0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
226f0 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  y==pPg );.      
22700 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  pPg->pDirty->pPr
22710 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  evDirty = pPg->p
22720 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d  PrevDirty;.    }
22730 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
22740 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20  revDirty ){.    
22750 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
22760 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
22770 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20  y==pPg );.      
22780 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
22790 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
227a0 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
227b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
227c0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
227d0 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rty==pPg );.    
227e0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
227f0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
22800 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
22810 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
22820 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
22830 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
22840 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
22850 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
22860 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
22870 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
22880 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
22890 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
228a0 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
228b0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
228c0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
228d0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
228e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
228f0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
22900 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
22910 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
22920 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
22930 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
22940 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
22950 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
22960 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
22970 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
22980 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
22990 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
229a0 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
229b0 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
229c0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
229d0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
229e0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
229f0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
22a00 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
22a10 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
22a20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
22a30 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
22a40 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
22a50 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
22a60 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
22a70 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
22a80 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
22a90 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
22aa0 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
22ab0 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
22ac0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
22ad0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
22ae0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
22af0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
22b00 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
22b10 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
22b20 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
22b30 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
22b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
22b50 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
22b60 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
22b70 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
22b80 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
22b90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
22ba0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
22bb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22bc0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
22bd0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
22be0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22bf0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
22c00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
22c10 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
22c20 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
22c30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22c40 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
22c50 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
22c60 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
22c70 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
22c80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
22c90 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ge was previousl
22ca0 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
22cb0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
22cc0 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65  at means.  ** we
22cd0 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72   didn't really r
22ce0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ead in the conte
22cf0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
22d00 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
22d10 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70  .  ** (for examp
22d20 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67  le) when the pag
22d30 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64  e is being moved
22d40 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
22d50 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20  .  But.  ** now 
22d60 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29  we are (perhaps)
22d70 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65   moving the page
22d80 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65   off of the free
22d90 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65  list for.  ** re
22da0 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20  use and we need 
22db0 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67  to know its orig
22dc0 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20  inal content so 
22dd0 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  that content.  *
22de0 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  * can be stored 
22df0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
22e00 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20  journal.  So do 
22e10 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73  the read at this
22e20 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f  .  ** time..  */
22e30 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65  .  rc = pager_ge
22e40 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
22e50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
22e70 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
22e80 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
22e90 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
22ea0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
22eb0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
22ec0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
22ed0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
22ee0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
22ef0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
22f00 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
22f10 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74  l && (pageInStat
22f20 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
22f30 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
22f40 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
22f50 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
22f60 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  1;.    pPager->d
22f70 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
22f80 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
22f90 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
22fa0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
22fb0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
22fc0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
22fd0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
22fe0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
22ff0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
23000 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
23010 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
23020 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
23030 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
23040 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23050 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
23060 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
23070 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
23080 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
23090 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
230a0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
230b0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
230c0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
230d0 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69  n(pPg, 0);.    i
230e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
230f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
23100 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
23110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23120 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
23130 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
23140 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
23150 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
23160 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
23170 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
23180 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
23190 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
231a0 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
231b0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
231c0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
231d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
231e0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
231f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
23200 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
23210 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
23220 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
23230 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
23240 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
23250 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
23260 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
23270 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
23280 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
23290 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
232a0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
232b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
232c0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
232d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
232e0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
232f0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
23300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23310 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
23320 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  && (pPager->jour
23330 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42  nalOpen || MEMDB
23340 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
23350 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
23360 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
23370 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
23380 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
23390 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
233a0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
233b0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
233c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
233d0 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
233e0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
233f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
23400 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
23410 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23420 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
23430 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
23440 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
23450 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 50 61  lite3Malloc( pPa
23460 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
23470 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
23480 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
23490 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
234a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
234b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
234c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
234d0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
234e0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
234f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23500 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
23510 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
23520 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  cksum;.         
23530 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
23540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
23550 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
23560 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
23570 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
23580 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
23590 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
235a0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
235b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
235c0 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
235d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
235e0 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
235f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23600 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
23610 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
23620 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   );.          pD
23630 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
23640 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
23650 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
23660 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
23670 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
23680 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
23690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
236a0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
236b0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
236c0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d  journalOff, pPg-
236d0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
236e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
236f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23710 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
23720 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
23730 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
23760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23770 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   + 4);.         
23780 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
23790 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
237a0 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20  >pageSize+4;.   
237b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
237c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
237d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
237e0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
237f0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
23800 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
23810 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  lOff, cksum);.  
23820 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
23830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
23840 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
23850 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
23860 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
23870 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
23880 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
23890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
238b0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
238c0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
238d0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
238e0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
238f0 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
23900 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35       PAGERTRACE5
23910 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
23920 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
23930 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
23950 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
23960 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
23970 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f  needSync, pager_
23980 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
23990 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
239a0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
239b0 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
239c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
239d0 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  The .          *
239e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
239f0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
23a00 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
23a10 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  bove..          
23a20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
23a30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23a40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
23a50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
23a60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
23a70 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
23a80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23a90 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
23aa0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
23ab0 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
23ac0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
23ad0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
23ae0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
23af0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
23b00 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
23b10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
23b20 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
23b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23b40 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
23b50 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
23b60 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
23b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23b80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
23b90 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
23ba0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
23bb0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
23bc0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
23bd0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ync;.        PAG
23be0 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44  ERTRACE4("APPEND
23bf0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
23c00 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
23c10 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
23c20 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
23c30 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
23c40 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
23c50 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
23c60 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
23c70 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
23c80 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
23c90 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
23ca0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
23cb0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
23cc0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
23cd0 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
23ce0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
23cf0 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
23d00 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
23d10 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
23d20 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
23d30 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
23d40 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
23d50 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
23d60 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
23d70 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
23d80 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
23d90 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
23da0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
23db0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
23dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23dd0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
23de0 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67  se .     && !pag
23df0 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
23e00 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29  ) .     && (int)
23e10 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
23e20 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20  r->stmtSize .   
23e30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23e40 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
23e50 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
23e60 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
23e70 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
23e80 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
23e90 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
23ea0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
23eb0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
23ec0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
23ed0 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
23ee0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
23ef0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
23f00 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 50 61 67  ite3Malloc( pPag
23f10 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
23f20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
23f30 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
23f40 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
23f50 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
23f60 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
23f70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
23f80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23f90 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
23fa0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
23fb0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
23fc0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
23fd0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
23fe0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
23ff0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
24000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24010 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
24020 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
24030 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
24040 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63  Size);.        c
24050 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
24060 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
24070 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
24080 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
24090 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
240a0 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
240b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
240c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
240d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
240e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
240f0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
24100 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >stfd, pData2, p
24110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
24120 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
24130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
24140 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
24150 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
24160 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
24170 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
24180 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
24190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
241a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
241b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
241c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
241d0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
241e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
241f0 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29  er->pInStmt!=0 )
24200 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24210 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
24220 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
24230 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
24240 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24250 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
24260 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
24270 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
24280 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
24290 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
242a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
242b0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
242c0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
242d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
242e0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
242f0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
24300 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
24310 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
24320 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
24330 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
24340 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
24350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24360 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24370 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
24380 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
24390 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
243a0 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
243b0 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
243c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
243d0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
243e0 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
243f0 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
24400 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
24410 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
24420 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
24430 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
24440 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
24450 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
24460 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
24470 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
24480 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
24490 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
244a0 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
244b0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
244c0 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
244d0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
244e0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
244f0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
24500 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
24510 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
24520 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
24530 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
24540 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
24550 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24560 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
24570 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
24580 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
24590 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
245a0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
245b0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
245c0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
245d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
245e0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
245f0 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  er);.  if( !MEMD
24600 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
24610 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
24620 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
24630 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
24640 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
24650 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
24660 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
24670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24680 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
24690 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
246a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
246b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
246c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
246d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
246e0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
246f0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
24700 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
24710 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
24720 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
24730 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
24740 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
24750 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
24760 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
24770 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
24780 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
24790 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
247a0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
247b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
247c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
247d0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
247e0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
247f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
24800 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
24810 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
24820 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
24830 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
24840 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
24850 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
24860 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
24870 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
24880 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
24890 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
248a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
248b0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
248c0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
248d0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
248e0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
248f0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
24900 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74   + 1;..    sqlit
24910 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24920 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
24930 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
24940 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
24950 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
24960 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
24970 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
24980 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
24990 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
249a0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
249b0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
249c0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
249d0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
249e0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
249f0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
24a00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
24a10 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
24a20 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
24a30 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
24a40 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
24a50 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
24a60 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
24a70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
24a80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
24a90 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
24aa0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
24ab0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
24ac0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
24ad0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24ae0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24af0 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
24b00 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
24b10 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
24b20 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
24b30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24b40 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
24b50 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
24b60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24b80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
24b90 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
24ba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
24bb0 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
24bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
24bd0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
24c00 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
24c10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24c30 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
24c40 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
24c50 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
24c60 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24c70 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
24c80 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
24c90 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
24ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24cb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67      /* If the Pg
24cc0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
24cd0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
24ce0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
24cf0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
24d00 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
24d10 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
24d20 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
24d30 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
24d40 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
24d50 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
24d60 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
24d70 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
24d80 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
24d90 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
24da0 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
24db0 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
24dc0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
24dd0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
24de0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
24df0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
24e00 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
24e10 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
24e20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
24e30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
24e40 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
24e50 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
24e60 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
24e70 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
24e80 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
24e90 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e  pPage ) pPage->n
24ea0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24eb0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24ec0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
24ed0 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
24ee0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24ef0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
24f00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
24f10 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
24f20 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
24f30 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
24f40 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
24f50 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
24f60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24f70 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
24f80 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
24f90 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
24fa0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
24fb0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
24fc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24fd0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
24fe0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
24ff0 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
25000 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
25010 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
25020 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
25030 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
25040 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
25050 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
25060 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
25070 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
25080 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
25090 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
250a0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
250b0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
250c0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
250d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
250e0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
250f0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
25100 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
25110 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
25120 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
25130 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
25140 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
25150 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
25160 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
25170 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
25180 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
25190 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
251a0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
251b0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
251c0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
251d0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
251e0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
251f0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
25200 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
25210 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
25220 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
25230 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
25240 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
25250 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
25260 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
25270 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
25280 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
25290 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
252a0 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
252b0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
252c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
252d0 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
252e0 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
252f0 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
25300 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
25310 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
25320 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
25330 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
25340 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
25350 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
25360 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
25370 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
25380 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
25390 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
253a0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
253b0 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
253c0 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
253d0 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
253e0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
253f0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
25400 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
25410 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
25420 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
25430 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
25440 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
25450 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
25460 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
25470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
25480 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
25490 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
254a0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
254b0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
254c0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
254d0 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
254e0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
254f0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
25500 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
25510 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
25520 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
25530 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
25540 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
25550 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
25560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
25570 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
25580 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
25590 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
255a0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
255b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
255c0 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
255d0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61  B ) return;.  pa
255e0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
255f0 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
25600 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
25610 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
25620 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
25630 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
25640 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25650 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
25660 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
25670 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
25680 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
25690 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
256a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
256b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
256c0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
256d0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
256e0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
256f0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
25700 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
25710 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
25720 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
25730 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
25740 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
25750 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
25760 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
25770 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
25780 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
25790 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
257a0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
257b0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
257c0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
257d0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
257e0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
257f0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
25800 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
25810 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
25820 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
25830 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
25840 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
25850 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
25860 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
25870 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
25880 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
25890 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
258a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
258b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
258c0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
258d0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
258e0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
258f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
25900 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
25910 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
25920 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
25930 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b  pgno)).      mak
25940 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66  eClean(pPg);.#if
25950 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
25960 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
25970 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
25980 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
25990 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
259a0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
259b0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
259c0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
259d0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
259e0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
259f0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
25a00 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
25a10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
25a20 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
25a30 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
25a40 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
25a50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
25a60 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
25a70 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
25a80 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
25a90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
25aa0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
25ab0 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
25ac0 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
25ad0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
25ae0 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
25af0 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
25b00 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
25b10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
25b20 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
25b30 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
25b40 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
25b50 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
25b60 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
25b70 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
25b80 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
25b90 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
25ba0 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
25bb0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
25bc0 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
25bd0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
25be0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
25bf0 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ger;..  pagerEnt
25c00 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  er(pPager);.  as
25c10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25c20 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
25c30 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
25c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25c50 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
25c60 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25c70 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a   been called on.
25c80 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28    ** this page (
25c90 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73  DontWrite() sets
25ca0 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
25cb0 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20  ack flag), then 
25cc0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
25cd0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
25ce0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
25cf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
25d00 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73 52   || pPg->alwaysR
25d10 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
25d20 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
25d30 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c 65  k ){.    pagerLe
25d40 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
25d50 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
25d60 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
25d70 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d      /* For a mem
25d80 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  db, pPager->jour
25d90 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79  nalOpen is alway
25da0 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 0 */..#ifdef S
25db0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
25dc0 45 54 45 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  ETE.  if( pPg->i
25dd0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
25de0 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20 70 50 61  )pPg->pgno > pPa
25df0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
25e00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
25e10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25e20 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  If SECURE_DELETE
25e30 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
25e40 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  en there is no w
25e50 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  ay that this.  *
25e60 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  * routine can be
25e70 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
25e80 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69  e for which sqli
25e90 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
25ea0 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e().  ** has not
25eb0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
25ec0 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74   called during t
25ed0 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
25ee0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66  ion..  ** And if
25ef0 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25f00 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e   previously been
25f10 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c   called, the fol
25f20 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64  lowing.  ** cond
25f30 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
25f40 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
25f50 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  t( !pPg->inJourn
25f60 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
25f70 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
25f80 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20  origDbSize );.. 
25f90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25fa0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
25fb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
25fc0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
25fd0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
25fe0 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f  no);.  pPg->inJo
25ff0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67  urnal = 1;.  pPg
26000 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
26010 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26020 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
26030 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26040 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  tmtSize >= pPage
26050 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
26060 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
26070 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
26080 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
26090 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  );.  }.  PAGERTR
260a0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
260b0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
260c0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
260d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
260e0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
260f0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
26100 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
26110 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76  no)).  pagerLeav
26120 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  e(pPager);.}.../
26130 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26140 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
26150 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
26160 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
26170 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
26180 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
26190 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
261a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
261b0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
261c0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
261d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
261e0 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
261f0 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
26200 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
26210 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26220 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  _OK;..  if( !pPa
26230 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
26240 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
26250 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
26260 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
26270 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
26280 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26290 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
262a0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
262b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
262c0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
262d0 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
262e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
262f0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
26300 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
26310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26330 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
26340 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26350 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26360 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
26370 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
26380 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
26390 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
263a0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
263b0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
263c0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
263d0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
263e0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
263f0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
26400 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
26410 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
26420 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
26430 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
26440 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
26450 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
26460 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
26470 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
26480 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
26490 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
264a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
264b0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
264c0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
264d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
264e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
264f0 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
26500 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
26510 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26520 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
26530 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
26540 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
26550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26560 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
26570 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
26580 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
26590 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
265a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
265b0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
265c0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
265d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
265e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
265f0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
26600 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
26610 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
26620 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
26630 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
26640 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
26650 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
26660 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
26670 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
26680 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
26690 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
266a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
266b0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
266c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
266d0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
266e0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
266f0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
26700 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
26710 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
26720 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
26730 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26740 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
26750 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
26760 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
26770 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
26780 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
26790 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
267a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
267b0 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
267c0 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
267d0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
267e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
267f0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
26800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
26810 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
26820 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
26830 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
26840 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
26850 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
26860 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
26870 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
26880 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
26890 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
268a0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
268b0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
268c0 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
268d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
268e0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
268f0 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
26900 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
26910 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
26920 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
26930 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  abases)..**.** I
26940 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
26950 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
26960 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
26970 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26980 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
26990 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
269a0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
269b0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
269c0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
269d0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
269e0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
269f0 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
26a00 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
26a10 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
26a20 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
26a30 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
26a40 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26a50 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
26a60 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
26a70 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
26a80 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a  .  Pgno nTrunc,.
26a90 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
26aa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26ab0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
26ac0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
26ad0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
26ae0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
26af0 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e  .  /* If no chan
26b00 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
26b10 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65  de, we can leave
26b20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
26b30 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69   early..  */.  i
26b40 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
26b50 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
26b60 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
26b70 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
26b80 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
26b90 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
26ba0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
26bb0 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
26bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26bd0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
26be0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
26bf0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
26c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26c10 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
26c20 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
26c30 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
26c40 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
26c50 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
26c60 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
26c70 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
26c80 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
26c90 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66  Pager);..  /* If
26ca0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
26cb0 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
26cc0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
26cd0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
26ce0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
26cf0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
26d00 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
26d10 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
26d20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
26d30 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
26d40 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
26d50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
26d60 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
26d70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
26d80 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
26d90 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
26da0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
26db0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
26dc0 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
26dd0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
26de0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
26df0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
26e00 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
26e10 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
26e20 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
26e30 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
26e40 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
26e50 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
26e60 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
26e70 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
26e80 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
26e90 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
26ea0 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
26eb0 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
26ec0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
26ed0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
26ee0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
26ef0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
26f00 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
26f10 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
26f20 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
26f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
26f40 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
26f50 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
26f60 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
26f70 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
26f80 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20  seAtomicWrite = 
26f90 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74  (.        !zMast
26fa0 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  er && .        p
26fb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
26fc0 65 6e 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  en &&.        pP
26fd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
26fe0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
26ff0 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20  (pPager) && .   
27000 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26       nTrunc==0 &
27010 26 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70  & .        (0==p
27020 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c  Pager->pDirty ||
27030 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72   0==pPager->pDir
27040 74 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  ty->pDirty).    
27050 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
27070 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
27080 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
27090 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
270a0 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41   );.    if( useA
270b0 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20  tomicWrite ){.  
270c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
270d0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
270e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
270f0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  . */.      int o
27100 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
27110 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
27120 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
27130 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  c);.      assert
27140 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31  (pPager->nRec==1
27150 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
27160 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
27170 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  ->jfd, offset, p
27180 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20  Pager->nRec);.. 
27190 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
271a0 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
271b0 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66  e counter. The f
271c0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
271d0 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20  ll modify.      
271e0 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ** the in-memory
271f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
27200 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63  of page 1 to inc
27210 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
27220 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65  .      ** change
27230 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
27240 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64  n write page 1 d
27250 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64  irectly to the d
27260 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
27270 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
27280 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
27290 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  te property of t
272a0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
272b0 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74  tem, .      ** t
272c0 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
272d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
272e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
272f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
27300 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
27310 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
27320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27330 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
27340 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
27350 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  reate(pPager->jf
27360 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  d);.    }..    i
27370 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69  f( !useAtomicWri
27380 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  te && rc==SQLITE
27390 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20  _OK ).#endif..  
273a0 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
273b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
273c0 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
273d0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
273e0 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
273f0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
27400 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
27410 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
27420 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
27430 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
27440 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
27450 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
27460 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
27470 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
27480 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
27490 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
274a0 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
274b0 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
274c0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
274d0 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
274e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
274f0 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
27500 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
27510 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
27520 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
27530 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
27540 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27560 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
27570 65 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20  exit;.      if( 
27580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27590 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
275a0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69  ALMODE_OFF ){.#i
275b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
275c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
275d0 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
275e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
275f0 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
27600 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
27610 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
27620 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
27630 61 67 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ages.          *
27640 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
27650 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
27660 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
27670 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
27680 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  al.          ** 
27690 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
276a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  */.          Pgn
276b0 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  o i;.          i
276c0 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
276d0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
276e0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
276f0 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
27700 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
27710 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
27720 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
27730 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
27740 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27750 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
27760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27780 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
27790 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
277a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
277b0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
277c0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
277d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
277e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
277f0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
27800 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
27810 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
27820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27830 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
27840 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
27850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27860 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20        } .       
27870 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
27880 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
27890 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
278a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
278b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
278c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
278d0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
278e0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
278f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
27900 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
27910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27920 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27930 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27940 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
27950 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
27960 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
27970 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
27980 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
27990 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
279a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
279b0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
279c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
279d0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
279e0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
279f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27a00 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
27a10 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
27a20 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
27a30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
27a40 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
27a50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
27a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27a70 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
27a80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
27a90 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  KED );.      /* 
27aa0 54 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20  The error might 
27ab0 68 61 76 65 20 6c 65 66 74 20 74 68 65 20 64 69  have left the di
27ac0 72 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75  rty list all fou
27ad0 6c 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20  led up here,.   
27ae0 20 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64     ** but that d
27af0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62  oes not matter b
27b00 65 63 61 75 73 65 20 69 66 20 74 68 65 20 69 66  ecause if the if
27b10 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
27b20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  did.      ** get
27b30 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
27b40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
27b50 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20   will roll back 
27b60 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  and.      ** dis
27b70 63 61 72 64 20 74 68 65 20 64 69 72 74 79 20 6c  card the dirty l
27b80 69 73 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  ist.  There is a
27b90 6e 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20  n assert in.    
27ba0 20 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61    ** pager_get_a
27bb0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29  ll_dirty_pages()
27bc0 20 74 68 61 74 20 76 65 72 69 66 69 65 73 20 74   that verifies t
27bd0 68 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20  hat no attempt. 
27be0 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20       ** is made 
27bf0 74 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69  to use an invali
27c00 64 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20  d dirty list..  
27c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74      */.      got
27c20 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
27c30 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
27c40 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Dirty = 0;..    
27c50 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
27c60 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
27c70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27c80 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
27c90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27ca0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
27cb0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
27cc0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
27cd0 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
27ce0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
27cf0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
27d00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
27d10 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
27d20 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
27d30 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
27d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27d50 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
27d60 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
27d70 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
27d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
27d90 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
27da0 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
27db0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
27dc0 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
27dd0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
27de0 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
27df0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
27e00 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
27e10 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
27e20 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
27e30 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
27e40 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
27e50 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
27e60 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
27e70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
27e80 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
27e90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27ea0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65  BUSY;.  }.  page
27eb0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27ed0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
27ee0 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
27ef0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
27f00 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
27f10 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
27f20 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
27f30 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
27f40 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
27f50 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
27f60 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
27f70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
27f80 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
27f90 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
27fa0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
27fb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27fc0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
27fd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27fe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
27ff0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
28000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
28010 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
28020 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
28030 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
28040 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
28050 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
28060 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
28070 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
28080 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30  r->dbModified==0
28090 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61   &&.        (pPa
280a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
280b0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
280c0 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20  ODE_DELETE ||.  
280d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
280e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30  exclusiveMode!=0
280f0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
28100 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
28110 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
28120 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
28130 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
28140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
28150 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28160 72 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  r);.  PAGERTRACE
28170 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
28180 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28190 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
281a0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
281b0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
281c0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
281d0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
281e0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
281f0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
28200 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
28210 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61  ger);.      clea
28220 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
28230 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
28240 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
28250 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
28260 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
28270 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28280 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
28290 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
282a0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
282b0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
282c0 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
282d0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
282e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
282f0 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  rty = 0;.#ifndef
28300 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
28310 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
28320 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
28330 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
28340 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
28350 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
28360 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
28370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
28380 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
28390 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
283a0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
283b0 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
283c0 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
283d0 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
283e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
283f0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
28400 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
28410 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61  R_SHARED;.    pa
28420 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28440 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
28450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
28460 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
28470 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69  D || !pPager->di
28480 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63  rtyCache );.  rc
28490 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
284a0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
284b0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
284c0 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
284d0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
284e0 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  rc);.  pagerLeav
284f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
28500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28510 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
28520 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
28530 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
28540 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
28550 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
28560 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
28570 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
28580 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
28590 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
285a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
285b0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
285c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
285d0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
285e0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
285f0 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
28600 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
28610 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
28620 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
28630 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
28640 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
28650 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
28660 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
28670 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
28680 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
28690 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
286a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
286b0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
286c0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
286d0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
286e0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
286f0 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
28700 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28710 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
28720 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
28730 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28740 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47  .  int rc;.  PAG
28750 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
28760 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
28770 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
28780 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
28790 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
287a0 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
287b0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
287c0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
287d0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
287e0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
287f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
28800 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
28810 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
28820 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
28830 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
28840 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
28850 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
28860 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
28870 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
28880 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
28890 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
288a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
288b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
288c0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
288d0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
288e0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
288f0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
28900 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
28910 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
28920 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
28930 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
28940 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
28950 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
28960 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
28970 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28980 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
28990 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45  se{.        PAGE
289a0 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64  RTRACE3("PAGE %d
289b0 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
289c0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
289d0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
289e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
289f0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
28a00 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
28a10 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
28a20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
28a30 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
28a40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  t = 0;.      pHi
28a50 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
28a60 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
28a70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
28a80 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
28a90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
28aa0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
28ab0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28ac0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
28ad0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
28ae0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
28af0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
28b00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
28b10 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
28b20 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70  rigDbSize;.    p
28b30 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
28b40 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
28b50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
28b60 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
28b70 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
28b80 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
28b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28ba0 20 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65    }..  pagerEnte
28bb0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
28bc0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
28bd0 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d  ache || !pPager-
28be0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
28bf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
28c00 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
28c10 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
28c20 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 70  etMaster);.    p
28c30 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
28c40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
28c50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
28c60 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
28c70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
28c80 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
28c90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28ca0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
28cb0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
28cc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
28cd0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
28ce0 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
28cf0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
28d00 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
28d10 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
28d20 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
28d30 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
28d40 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
28d50 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
28d60 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
28d70 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
28d80 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
28d90 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
28da0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20  >setMaster);.   
28db0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28dc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
28dd0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
28de0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
28df0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
28e00 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f  ger, 0);.  }.  /
28e10 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50  * pager_reset(pP
28e20 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67  ager); */.  pPag
28e30 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
28e40 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
28e50 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
28e60 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
28e70 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
28e80 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
28e90 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
28ea0 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
28eb0 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
28ec0 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
28ed0 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
28ee0 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  t..  */.  rc = p
28ef0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
28f00 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
28f10 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28f30 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
28f40 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
28f50 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
28f60 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
28f70 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
28f80 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
28f90 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
28fa0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
28fb0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
28fc0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
28fd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28fe0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
28ff0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
29000 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
29010 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
29020 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
29030 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
29040 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29050 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
29060 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
29070 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
29080 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29090 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
290a0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
290b0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
290c0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
290d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
290e0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
290f0 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
29100 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
29110 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
29120 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
29130 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
29140 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
29150 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
29160 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
29170 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
29180 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
29190 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
291a0 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
291b0 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
291c0 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
291d0 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
291e0 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
291f0 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
29200 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
29210 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
29220 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
29230 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
29240 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
29250 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e  urn MEMDB;.}.#en
29260 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
29270 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
29280 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
29290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
292a0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
292b0 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
292c0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
292d0 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
292e0 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
292f0 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
29300 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
29310 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
29320 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
29330 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
29340 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
29350 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
29360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
29370 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
29380 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
29390 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
293a0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
293b0 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
293c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
293d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
293e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
293f0 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
29400 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
29410 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
29420 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
29430 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
29440 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
29450 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
29460 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
29470 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29480 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
29490 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
294a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
294b0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
294c0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
294d0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
294e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
294f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
29500 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
29510 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
29520 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
29530 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  rt( pPager->pInS
29540 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  tmt==0 );.  pPag
29550 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71  er->pInStmt = sq
29560 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
29570 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
29580 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
29590 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
295a0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d  Pager->pInStmt==
295b0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
295c0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
295d0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
295e0 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  K); */.    retur
295f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29600 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
29610 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
29620 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
29630 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
29640 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29650 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
29660 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
29670 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
29680 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
29690 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
296a0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
296b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
296c0 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
296d0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
296e0 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  tfd, SQLITE_OPEN
296f0 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
29700 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29710 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69    goto stmt_begi
29720 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  n_failed;.    }.
29730 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
29740 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
29750 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
29760 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
29770 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
29780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29790 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
297a0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
297b0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
297c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
297d0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
297e0 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
297f0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
29800 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
29810 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
29820 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
29830 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
29840 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
29850 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
29860 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
29870 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
29880 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
29890 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
298a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
298b0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
298c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
298d0 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
298e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
298f0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
29900 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
29910 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
29920 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
29930 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
29940 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
29950 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
29960 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
29970 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
29980 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
29990 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
299a0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
299b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
299c0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
299d0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
299e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
299f0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
29a00 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  lse{.      for(p
29a10 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
29a20 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
29a30 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
29a40 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
29a50 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
29a60 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
29a70 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d    pNext = pHist-
29a80 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
29a90 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
29aa0 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  t->inStmt );.   
29ab0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
29ac0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
29ad0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
29ae0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
29af0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
29b00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
29b10 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
29b20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
29b30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
29b40 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
29b50 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
29b60 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
29b70 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
29b80 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
29b90 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
29ba0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
29bb0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
29bc0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
29bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29be0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
29bf0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
29c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
29c10 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
29c20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
29c30 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
29c40 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
29c50 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
29c60 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
29c70 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
29c80 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
29c90 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
29ca0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
29cb0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
29cc0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
29cd0 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f  *pHist;.      fo
29ce0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
29cf0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48  tmt; pPg; pPg=pH
29d00 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  ist->pNextStmt){
29d10 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d  .        pHist =
29d20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
29d30 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
29d40 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
29d50 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
29d60 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
29d70 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
29d80 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
29d90 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
29da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29db0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
29dc0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
29dd0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
29de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29df0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29e00 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
29e10 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
29e20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
29e30 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
29e40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29e50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
29e60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29e70 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
29e80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
29e90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
29ea0 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
29eb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29ed0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
29ee0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
29ef0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
29f00 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
29f10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
29f20 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
29f30 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
29f40 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
29f50 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29f60 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
29f70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29f80 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
29f90 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
29fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
29fb0 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
29fc0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
29fd0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
29fe0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
29ff0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
2a000 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2a010 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
2a020 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
2a030 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
2a040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2a050 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
2a060 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
2a070 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
2a080 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
2a090 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
2a0a0 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
2a0b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
2a0c0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
2a0d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a0e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2a0f0 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
2a100 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
2a110 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
2a120 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
2a130 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
2a140 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
2a150 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2a160 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
2a170 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
2a180 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2a190 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2a1a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
2a1b0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
2a1c0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
2a1d0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
2a1e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2a1f0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
2a200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a210 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
2a220 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
2a230 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
2a240 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
2a250 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
2a260 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
2a270 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
2a280 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
2a290 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2a2a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2a2b0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
2a2c0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
2a2d0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
2a2e0 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
2a2f0 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
2a300 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2a310 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
2a320 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
2a330 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
2a340 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
2a350 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
2a360 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
2a370 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
2a380 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
2a390 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
2a3a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
2a3b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2a3c0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
2a3d0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
2a3e0 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
2a3f0 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
2a400 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
2a410 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
2a420 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
2a430 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
2a440 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
2a450 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
2a460 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
2a470 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
2a480 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
2a490 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
2a4a0 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64  previous located
2a4b0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
2a4c0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
2a4d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2a4e0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
2a4f0 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
2a500 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
2a510 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
2a520 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
2a530 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
2a540 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
2a550 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
2a560 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
2a570 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
2a580 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
2a590 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
2a5a0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
2a5b0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2a5c0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2a5d0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
2a5e0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
2a5f0 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
2a600 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a610 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
2a620 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
2a630 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
2a640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
2a650 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
2a660 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
2a670 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
2a680 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
2a690 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
2a6a0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
2a6b0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
2a6c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
2a6d0 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
2a6e0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
2a6f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2a700 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
2a710 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
2a720 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
2a730 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
2a740 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69  rwritten. */.  i
2a750 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
2a760 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
2a770 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
2a780 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
2a790 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
2a7a0 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
2a7b0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
2a7c0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
2a7d0 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
2a7e0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2a7f0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
2a800 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
2a810 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
2a820 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
2a830 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
2a840 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
2a850 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
2a860 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  nt(pPg);.  if( p
2a870 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
2a880 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
2a890 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
2a8a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
2a8b0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
2a8c0 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
2a8d0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
2a8e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
2a8f0 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
2a900 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
2a910 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
2a920 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
2a930 69 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  its hash-chain *
2a940 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
2a950 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
2a960 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2a970 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
2a980 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
2a990 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
2a9a0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
2a9b0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
2a9c0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
2a9d0 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
2a9e0 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
2a9f0 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
2aa00 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
2aa10 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
2aa20 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
2aa30 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
2aa40 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
2aa50 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  /.  pPg->needSyn
2aa60 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20  c = 0;.  pPgOld 
2aa70 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2aa80 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
2aa90 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
2aaa0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
2aab0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
2aac0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
2aad0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
2aae0 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
2aaf0 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
2ab00 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67  ->needSync = pPg
2ab10 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20  Old->needSync;. 
2ab20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d   }else{.    pPg-
2ab30 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
2ab40 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   }.  pPg->inJour
2ab50 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
2ab60 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
2ab70 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
2ab80 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  );..  /* Change 
2ab90 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2aba0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
2abb0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
2abc0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
2abd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
2abe0 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
2abf0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
2ac00 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
2ac10 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
2ac20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2ac30 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
2ac40 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2ac50 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
2ac60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
2ac70 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
2ac80 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
2ac90 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
2aca0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2acb0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
2acc0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
2acd0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
2ace0 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
2acf0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
2ad00 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
2ad10 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2ad20 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
2ad30 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
2ad40 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
2ad50 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
2ad60 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
2ad70 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
2ad80 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
2ad90 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
2ada0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
2adb0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
2adc0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
2add0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
2ade0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
2adf0 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
2ae00 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
2ae10 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
2ae20 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2ae30 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
2ae40 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
2ae50 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
2ae60 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
2ae70 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2ae80 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
2ae90 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
2aea0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
2aeb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2aec0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2aed0 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69   load the page i
2aee0 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63  nto the page-cac
2aef0 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20  he fails, (due. 
2af00 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f     ** to a mallo
2af10 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72  c() or IO failur
2af20 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69  e), clear the bi
2af30 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72  t in the pInJour
2af40 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72  nal[].    ** arr
2af50 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
2af60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f  f the page is lo
2af70 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e  aded and written
2af80 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a   again in.    **
2af90 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2afa0 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69  n, it may be wri
2afb0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2afc0 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
2afd0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79  .    ** it is sy
2afe0 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f  nced into the jo
2aff0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
2b000 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64   way, it may end
2b010 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68   up in.    ** th
2b020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
2b030 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69  wice, but that i
2b040 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e  s not a problem.
2b050 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2b060 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2b070 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
2b080 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
2b090 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
2b0a0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
2b0b0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
2b0c0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
2b0d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2b0e0 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  rc;.    PgHdr *p
2b0f0 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72  PgHdr;.    asser
2b100 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
2b110 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
2b120 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2b130 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
2b140 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a  Pgno, &pPgHdr);.
2b150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2b170 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
2b180 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65  urnal && (int)ne
2b190 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67  edSyncPgno<=pPag
2b1a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
2b1b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b1c0 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
2b1d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2b1e0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a   needSyncPgno);.
2b1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
2b200 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
2b210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2b220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  c;.    }.    pPa
2b230 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2b240 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e  1;.    pPgHdr->n
2b250 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2b260 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e   pPgHdr->inJourn
2b270 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
2b280 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
2b290 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2b2a0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
2b2b0 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  }..  pagerLeave(
2b2c0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
2b2d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2b2e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
2b2f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
2b300 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
2b310 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2b320 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
2b330 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
2b340 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
2b350 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
2b360 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
2b370 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2b380 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
2b390 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
2b3a0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
2b3b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
2b3c0 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
2b3d0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
2b3e0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
2b3f0 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
2b400 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2b410 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2b420 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
2b430 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
2b440 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
2b450 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
2b460 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
2b470 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
2b480 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
2b490 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
2b4a0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
2b4b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
2b4c0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
2b4d0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
2b4e0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
2b4f0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2b500 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
2b510 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
2b520 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
2b530 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
2b540 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
2b550 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
2b560 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
2b570 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
2b580 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b590 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
2b5a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2b5b0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
2b5c0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2b5d0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
2b5e0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
2b5f0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
2b600 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
2b610 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
2b620 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
2b630 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
2b640 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b650 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
2b660 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2b670 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b680 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
2b690 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2b6a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2b6b0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
2b6c0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2b6d0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
2b6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2b6f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2b700 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
2b710 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2b720 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
2b730 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
2b740 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2b750 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2b760 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2b770 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
2b780 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
2b790 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
2b7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
2b7b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
2b7c0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
2b7d0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
2b7e0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
2b7f0 20 6f 66 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   of PAGER_JOURNA
2b800 4c 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  LMODE_QUERY, PAG
2b810 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2b820 45 4c 45 54 45 20 6f 72 20 0a 2a 2a 20 50 41 47  ELETE or .** PAG
2b830 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2b840 45 52 53 49 53 54 2e 20 49 66 20 74 68 65 20 70  ERSIST. If the p
2b850 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2b860 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
2b870 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
2b880 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
2b890 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
2b8a0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2b8b0 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
2b8c0 65 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  er PAGER_JOURNAL
2b8d0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 0a 2a  MODE_DELETE or.*
2b8e0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
2b8f0 4f 44 45 5f 50 45 52 53 49 53 54 2c 20 69 6e 64  ODE_PERSIST, ind
2b900 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
2b910 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
2b920 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61  dated).** journa
2b930 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  l-mode..*/.int s
2b940 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2b950 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  alMode(Pager *pP
2b960 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
2b970 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
2b980 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2b990 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
2b9a0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2b9b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b9c0 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  DE_DELETE.      
2b9d0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2b9e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b9f0 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
2ba00 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2ba10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ba20 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
2ba30 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
2ba40 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
2ba50 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2ba60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
2ba70 54 45 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4a  TE>=0 && PAGER_J
2ba80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2ba90 53 54 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  ST>=0 );.  if( e
2baa0 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Mode>=0 ){.    p
2bab0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2bac0 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
2bad0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
2bae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2baf0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
2bb00 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
2bb10 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
2bb20 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
2bb30 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  iles..*/.i64 sql
2bb40 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
2bb50 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
2bb60 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
2bb70 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
2bb80 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
2bb90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2bba0 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
2bbb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
2bbc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2bbd0 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65  eLimit;.}..#ifde
2bbe0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
2bbf0 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
2bc00 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
2bc10 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
2bc20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
2bc30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2bc40 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
2bc50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
2bc60 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
2bc70 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
2bc80 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
2bc90 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
2bca0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
2bcb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2bcc0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2bcd0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
2bce0 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
2bcf0 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
2bd00 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
2bd10 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
2bd20 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
2bd30 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
2bd40 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
2bd50 2a 2f 0a                                         */.