/ Hex Artifact Content
Login

Artifact bb286b2fc0c7c87d0a8cbfee96a3e953da1e53dd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 36  : pager.c,v 1.46
0350: 35 20 32 30 30 38 2f 30 37 2f 31 31 20 30 33 3a  5 2008/07/11 03:
0360: 33 34 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a  34:10 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 67 48 64 72 20 2a 70 50 72 65 76 41 6c 6c 3b 20  gHdr *pPrevAll; 
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30a0: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
30b0: 61 67 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 4c  ages */.  PagerL
30c0: 72 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20 20 20  ruLink gfree;   
30d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62           /* Glob
30e0: 61 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65 66 3d  al list of nRef=
30f0: 3d 30 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64  =0 pages */.#end
3100: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
3110: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75  _CHECK_PAGES.  u
3120: 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e  32 pageHash;.#en
3130: 64 69 66 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  dif.  void *pDat
3140: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3150: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74       /* Page dat
3160: 61 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  a */.  /* Pager.
3170: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
3180: 6c 6f 63 61 6c 20 64 61 74 61 20 61 70 70 65 6e  local data appen
3190: 64 65 64 20 74 6f 20 74 68 69 73 20 68 65 61 64  ded to this head
31a0: 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  er */.};../*.** 
31b0: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
31c0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
31d0: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
31e0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
31f0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
3200: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
3210: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
3220: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
3230: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
3240: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
3250: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3260: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
3270: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
3280: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
3290: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
32a0: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
32b0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
32c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
32d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
32e0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
32f0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
3300: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
3310: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
3320: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
3330: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
3340: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
3350: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
3360: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
3370: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
3380: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
3390: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
33a0: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
33b0: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
33c0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
33d0: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
33e0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
33f0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
3400: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
3410: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
3420: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
3430: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
3440: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
3450: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
3460: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
3470: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
3480: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
3490: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
34a0: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
34b0: 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ent */.  PgHdr *
34c0: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
34d0: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
34e0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
34f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
3500: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
3510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3520: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
3530: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3540: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3550: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
3560: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
3570: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
3580: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
3590: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
35a0: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
35b0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
35c0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
35d0: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
35e0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
35f0: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
3600: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
3610: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
3620: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
3630: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
3640: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
3650: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3660: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
3670: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
3680: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
3690: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
36a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
36b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
36c0: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
36d0: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
36e0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
36f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
3700: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 20 20 28  _TO_DATA(P)    (
3710: 28 50 29 2d 3e 70 44 61 74 61 29 0a 23 64 65 66  (P)->pData).#def
3720: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
3730: 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29  RA(G,P) ((void*)
3740: 26 28 28 47 29 5b 31 5d 29 29 0a 23 64 65 66 69  &((G)[1])).#defi
3750: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
3760: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
3770: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
3780: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
3790: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 6e  P)[1]))[(PGR)->n
37a0: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41  Extra])../*.** A
37b0: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
37c0: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
37d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37e0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
37f0: 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  * Pager.errCode 
3800: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51  may be set to SQ
3810: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
3820: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a  TE_CORRUPT, or.*
3830: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  * or SQLITE_FULL
3840: 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68  . Once one of th
3850: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72  e first three er
3860: 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20  rors occurs, it 
3870: 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20  persists.** and 
3880: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
3890: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
38a0: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
38b0: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
38c0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74   SQLITE_FULL ret
38d0: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67  urn code is slig
38e0: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20  htly different. 
38f0: 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79  It persists only
3900: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65   until the.** ne
3910: 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f  xt successful ro
3920: 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72  llback is perfor
3930: 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72  med on the pager
3940: 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a   cache. Also,.**
3950: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65   SQLITE_FULL doe
3960: 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65  s not affect the
3970: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
3980: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
3990: 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41  gerLookup().** A
39a0: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
39b0: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
39c0: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72  essfully..*/.str
39d0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
3a00: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
3a10: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
3a20: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20  journalOpen;    
3a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3a40: 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
3a50: 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20   descriptors is 
3a60: 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f  valid */.  u8 jo
3a70: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
3a80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3a90: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
3aa0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
3ab0: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3ad0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3ae0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3af0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3b00: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3b10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3b20: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3b30: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b40: 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20   u8 stmtOpen;   
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b60: 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74  True if the stat
3b70: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
3b80: 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38   is open */.  u8
3b90: 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20   stmtInUse;     
3ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3bb0: 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74  e we are in a st
3bc0: 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
3bd0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73  action */.  u8 s
3be0: 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20  tmtAutoopen;    
3bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
3c00: 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65  stmt journal whe
3c10: 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  n main journal i
3c20: 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20  s opened*/.  u8 
3c30: 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  noSync;         
3c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
3c50: 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  ot sync the jour
3c60: 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  nal if true */. 
3c70: 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20   u8 fullSync;   
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c90: 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f  Do extra syncs o
3ca0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  f the journal fo
3cb0: 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a  r robustness */.
3cc0: 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b    u8 sync_flags;
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ce0: 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52   One of SYNC_NOR
3cf0: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
3d00: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d20: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
3d30: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
3d40: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
3d50: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d70: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
3d80: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
3d90: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3db0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
3dc0: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
3dd0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
3e00: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
3e10: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
3e20: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63  */.  u8 dirtyCac
3e30: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  he;             
3e40: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
3e50: 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68  ed pages have ch
3e60: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c  anged */.  u8 al
3e70: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
3e80: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
3e90: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
3ea0: 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a   for all pages *
3eb0: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
3ee0: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
3ef0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
3f00: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
3f20: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
3f30: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
3f40: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e  */.  u8 doNotSyn
3f50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3f60: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69   /* Boolean. Whi
3f70: 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20  le true, do not 
3f80: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
3f90: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
3fa0: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
3fb0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
3fc0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
3fd0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
3fe0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
3ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4000: 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52   On of the PAGER
4010: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
4020: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 64 62  alues */.  u8 db
4030: 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20  Modified;       
4040: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4050: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
4060: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44  changes to the D
4070: 62 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  b */.  u8 change
4080: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
4090: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
40a0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
40b0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
40c0: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
40d0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
40e0: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
40f0: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
4100: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  ) */.  int errCo
4110: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
4120: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
4130: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
4140: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
4150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4160: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4170: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4180: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
4190: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
41a0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
41b0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
41c0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
41d0: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
41e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
41f0: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
4200: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
4210: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
4220: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
4230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4240: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
4250: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4260: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
4270: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
4280: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
4290: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
42a0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
42b0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
42c0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
42d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
42e0: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
42f0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
4300: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4320: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
4330: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
4340: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
4350: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4370: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
4380: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
4390: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
43b0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
43c0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
43d0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
4400: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
4410: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
4420: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4440: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4450: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
4460: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
4470: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
4480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
4490: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
44a0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
44b0: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
44c0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
44d0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
44e0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
44f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4500: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
4510: 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  pInStmt;        
4520: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4530: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4540: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4550: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
4560: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4570: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
4580: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4590: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
45b0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
45c0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
45d0: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
45e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
45f0: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4600: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4610: 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  files */.  sqlit
4620: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
4630: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4640: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4650: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4660: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4670: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4680: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4690: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
46a0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
46b0: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
46c0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
46d0: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
46e0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
46f0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
4700: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
4710: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
4720: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
4730: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
4740: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4750: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4760: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4770: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4780: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4790: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
47a0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
47b0: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
47c0: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
47d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
47e0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
47f0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
4800: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
4810: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
4820: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
4830: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4840: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
4850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4860: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4870: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4880: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4890: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
48a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
48b0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
48c0: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
48d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
48e0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
48f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
4900: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
4910: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
4920: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
4930: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4940: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
4950: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4960: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4970: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4980: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4990: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
49a0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
49b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
49c0: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
49d0: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
49e0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
49f0: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
4a00: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
4a10: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
4a20: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
4a30: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
4a40: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
4a50: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a60: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a80: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a90: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4aa0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4ab0: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4ac0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4ad0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4ae0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4af0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4b00: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4b10: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4b20: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4b30: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4b40: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4b50: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b60: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b70: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b80: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b90: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bb0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4bc0: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4bd0: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bf0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4c00: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4c10: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4c20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4c30: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4c40: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c60: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c70: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c80: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c90: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4cb0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4cc0: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4cd0: 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e  */.  volatile in
4ce0: 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20  t iInUseMM;     
4cf0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4d00: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4d10: 4d 20 2a 2f 0a 20 20 76 6f 6c 61 74 69 6c 65 20  M */.  volatile 
4d20: 69 6e 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20  int iInUseDB;   
4d30: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d40: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4d50: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d60: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d70: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d80: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d90: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4da0: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4db0: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4dc0: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4dd0: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4de0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4df0: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4e00: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4e10: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
4e20: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
4e30: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
4e40: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a  nal files */.};.
4e50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4e60: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
4e70: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
4e80: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
4e90: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
4ea0: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
4eb0: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
4ec0: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
4ed0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
4ee0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4ef0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
4f00: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
4f10: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4f20: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
4f30: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
4f40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4f50: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
4f60: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
4f70: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4f80: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
4f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4fa0: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
4fb0: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
4fc0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4fd0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
4fe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4ff0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
5000: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
5010: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
5020: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
5030: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5040: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
5050: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
5060: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
5070: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
5080: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
5090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
50a0: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
50b0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
50c0: 68 65 61 64 20 6f 66 20 61 20 64 6f 75 62 6c 65  head of a double
50d0: 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20  -linked list.** 
50e0: 6f 66 20 61 6c 6c 20 70 61 67 65 72 73 20 74 68  of all pagers th
50f0: 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20  at are eligible 
5100: 66 6f 72 20 70 61 67 65 20 73 74 65 61 6c 69 6e  for page stealin
5110: 67 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69  g by the.** sqli
5120: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
5130: 72 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ry() interface. 
5140: 20 41 63 63 65 73 73 20 74 6f 20 74 68 69 73 20   Access to this 
5150: 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65  list is.** prote
5160: 63 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  cted by the SQLI
5170: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5180: 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23  MEM2 mutex..*/.#
5190: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
51a0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
51b0: 45 4d 45 4e 54 0a 73 74 61 74 69 63 20 50 61 67  EMENT.static Pag
51c0: 65 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  er *sqlite3Pager
51d0: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
51e0: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 73 71   PagerLruList sq
51f0: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
5200: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65   = {0, 0, 0};.#e
5210: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  ndif.../*.** Jou
5220: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
5230: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
5240: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
5250: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
5260: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
5270: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
5280: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
5290: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
52a0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
52b0: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
52c0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
52d0: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
52e0: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
52f0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
5300: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
5310: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
5320: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
5330: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
5340: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
5350: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
5360: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
5370: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
5380: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
5390: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
53a0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
53b0: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
53c0: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
53d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
53e0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
53f0: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
5400: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
5410: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
5420: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
5430: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
5440: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
5450: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
5460: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
5470: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
5480: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
5490: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
54a0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
54b0: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
54c0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
54d0: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
54e0: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
54f0: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
5500: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
5510: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
5520: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
5530: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
5540: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
5550: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
5560: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
5570: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
5580: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
5590: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
55a0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
55b0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
55c0: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
55d0: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
55e0: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
55f0: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
5600: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
5610: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
5620: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
5630: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
5640: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
5650: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
5660: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
5670: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
5680: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
5690: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
56a0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
56b0: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
56c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
56d0: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
56e0: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
56f0: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
5700: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
5710: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
5720: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
5730: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
5740: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
5750: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
5760: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
5770: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
5780: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
5790: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
57a0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
57b0: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
57c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
57d0: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
57e0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
57f0: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
5800: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
5810: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
5820: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
5830: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
5840: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
5850: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
5860: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
5870: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
5880: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
5890: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
58a0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
58b0: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
58c0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
58d0: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
58e0: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
58f0: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
5900: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
5910: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5920: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
5930: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
5940: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
5950: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
5960: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
5970: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5980: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
5990: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
59a0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
59b0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
59c0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
59d0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
59e0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
59f0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
5a00: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
5a10: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
5a20: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
5a30: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
5a40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5a50: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
5a60: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
5a70: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
5a80: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
5a90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
5aa0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
5ab0: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
5ac0: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
5ad0: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
5ae0: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
5af0: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
5b00: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
5b10: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
5b20: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
5b30: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
5b40: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
5b50: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
5b60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
5b70: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
5b80: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
5b90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5ba0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
5bb0: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
5bc0: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
5bd0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
5be0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
5bf0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5c00: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
5c10: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
5c20: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
5c30: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5c40: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
5c50: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5c60: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
5c70: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
5c80: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
5c90: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
5ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
5cb0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
5cc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
5cd0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
5ce0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
5cf0: 72 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67  rEnter() and pag
5d00: 65 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e  erLeave() routin
5d10: 65 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72  es acquire and r
5d20: 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65  elease.** a mute
5d30: 78 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e  x on each pager.
5d40: 20 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72    The mutex is r
5d50: 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  ecursive..**.** 
5d60: 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
5d70: 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e  l-purpose mutex.
5d80: 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64    It only provid
5d90: 65 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73  es mutual exclus
5da0: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  ion.** between t
5db0: 68 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65  he Btree and the
5dc0: 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65   Memory Manageme
5dd0: 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  nt sqlite3_relea
5de0: 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66  se_memory().** f
5df0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65  unction.  It doe
5e00: 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66  s not prevent, f
5e10: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20  or example, two 
5e20: 42 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65  Btrees from acce
5e30: 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d  ssing.** the sam
5e40: 65 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73  e pager at the s
5e50: 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72  ame time.  Other
5e60: 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
5e70: 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74   mutexes in.** t
5e80: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68  he btree layer h
5e90: 61 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65  andle that chore
5ea0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5eb0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
5ec0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74  _MANAGEMENT.  st
5ed0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45  atic void pagerE
5ee0: 6e 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a  nter(Pager *p){.
5ef0: 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b      p->iInUseDB+
5f00: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49  +;.    if( p->iI
5f10: 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e  nUseMM && p->iIn
5f20: 55 73 65 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e  UseDB==1 ){.#ifn
5f30: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
5f40: 5f 4e 4f 4f 50 0a 20 20 20 20 20 20 73 71 6c 69  _NOOP.      sqli
5f50: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5f60: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5f70: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
5f80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
5f90: 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e  TATIC_MEM2);.#en
5fa0: 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e  dif.      p->iIn
5fb0: 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20  UseDB = 0;.     
5fc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5fd0: 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
5fe0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d     p->iInUseDB =
5ff0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
6000: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
6010: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
6020: 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73  assert( p->iInUs
6030: 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  eMM==0 );.  }.  
6040: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
6050: 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29  rLeave(Pager *p)
6060: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
6070: 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B--;.    assert(
6080: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20   p->iInUseDB>=0 
6090: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64  );.  }.#else.# d
60a0: 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72  efine pagerEnter
60b0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67  (X).# define pag
60c0: 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69  erLeave(X).#endi
60d0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70 61 67  f../*.** Add pag
60e0: 65 20 70 50 67 20 74 6f 20 74 68 65 20 65 6e 64  e pPg to the end
60f0: 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
6100: 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 73  ist managed by s
6110: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c 69 73  tructure.** pLis
6120: 74 20 28 70 50 67 20 62 65 63 6f 6d 65 73 20 74  t (pPg becomes t
6130: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
6140: 20 74 68 65 20 6c 69 73 74 20 2d 20 74 68 65 20   the list - the 
6150: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
6160: 2a 20 75 73 65 64 29 2e 20 41 72 67 75 6d 65 6e  * used). Argumen
6170: 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70  t pLink should p
6180: 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70  oint to either p
6190: 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d  Pg->free or pPg-
61a0: 3e 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70 65 6e  >gfree,.** depen
61b0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
61c0: 70 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64  pPg is being add
61d0: 65 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d  ed to the pager-
61e0: 73 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a 20 67  specific or.** g
61f0: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a  lobal LRU list..
6200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6210: 69 73 74 41 64 64 28 50 61 67 65 72 4c 72 75 4c  istAdd(PagerLruL
6220: 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65  ist *pList, Page
6230: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c  rLruLink *pLink,
6240: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
6250: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 30  pLink->pNext = 0
6260: 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  ;.  pLink->pPrev
6270: 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 3b   = pList->pLast;
6280: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6290: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
62a0: 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72  NAGEMENT.  asser
62b0: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66  t(pLink==&pPg->f
62c0: 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70  ree || pLink==&p
62d0: 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73  Pg->gfree);.  as
62e0: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
62f0: 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74  ->gfree || pList
6300: 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  !=&sqlite3LruPag
6310: 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  eList);.#endif..
6320: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 4c 61    if( pList->pLa
6330: 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  st ){.    int iO
6340: 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69  ff = (char *)pLi
6350: 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67  nk - (char *)pPg
6360: 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  ;.    PagerLruLi
6370: 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20 3d 20  nk *pLastLink = 
6380: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
6390: 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74 2d 3e  (&((u8 *)pList->
63a0: 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b 0a 20  pLast)[iOff]);. 
63b0: 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e     pLastLink->pN
63c0: 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c  ext = pPg;.  }el
63d0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 21  se{.    assert(!
63e0: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29 3b 0a  pList->pFirst);.
63f0: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
6400: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a 20 20  t = pPg;.  }..  
6410: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70  pList->pLast = p
6420: 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69 73 74  Pg;.  if( !pList
6430: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 26  ->pFirstSynced &
6440: 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  & pPg->needSync=
6450: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  =0 ){.    pList-
6460: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6470: 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pPg;.  }.}../*.*
6480: 2a 20 52 65 6d 6f 76 65 20 70 50 67 20 66 72 6f  * Remove pPg fro
6490: 6d 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  m the list manag
64a0: 65 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ed by the struct
64b0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
64c0: 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  y pList..**.** A
64d0: 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68  rgument pLink sh
64e0: 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69  ould point to ei
64f0: 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f  ther pPg->free o
6500: 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 20 64 65  r pPg->gfree, de
6510: 70 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77  pending .** on w
6520: 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65  hether pPg is be
6530: 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
6540: 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20   pager-specific 
6550: 6f 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69  or global LRU li
6560: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
6570: 69 64 20 6c 69 73 74 52 65 6d 6f 76 65 28 50 61  id listRemove(Pa
6580: 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73  gerLruList *pLis
6590: 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  t, PagerLruLink 
65a0: 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70  *pLink, PgHdr *p
65b0: 50 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20  Pg){.  int iOff 
65c0: 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20  = (char *)pLink 
65d0: 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 0a  - (char *)pPg;..
65e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
65f0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6600: 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28  GEMENT.  assert(
6610: 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65  pLink==&pPg->fre
6620: 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67  e || pLink==&pPg
6630: 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65  ->gfree);.  asse
6640: 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  rt(pLink==&pPg->
6650: 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d  gfree || pList!=
6660: 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  &sqlite3LruPageL
6670: 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ist);.#endif..  
6680: 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e  if( pPg==pList->
6690: 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 70 4c  pFirst ){.    pL
66a0: 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 4c  ist->pFirst = pL
66b0: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ink->pNext;.  }.
66c0: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
66d0: 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  ->pLast ){.    p
66e0: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20 70 4c  List->pLast = pL
66f0: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
6700: 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 50 72    if( pLink->pPr
6710: 65 76 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c  ev ){.    PagerL
6720: 72 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c 69 6e  ruLink *pPrevLin
6730: 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  k = (PagerLruLin
6740: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69  k *)(&((u8 *)pLi
6750: 6e 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66 66 5d  nk->pPrev)[iOff]
6760: 29 3b 0a 20 20 20 20 70 50 72 65 76 4c 69 6e 6b  );.    pPrevLink
6770: 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d  ->pNext = pLink-
6780: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
6790: 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 29  ( pLink->pNext )
67a0: 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  {.    PagerLruLi
67b0: 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20 3d 20  nk *pNextLink = 
67c0: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
67d0: 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e  (&((u8 *)pLink->
67e0: 70 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b 0a 20  pNext)[iOff]);. 
67f0: 20 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50     pNextLink->pP
6800: 72 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  rev = pLink->pPr
6810: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ev;.  }.  if( pP
6820: 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  g==pList->pFirst
6830: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
6840: 48 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e  Hdr *p = pLink->
6850: 70 4e 65 78 74 3b 0a 20 20 20 20 77 68 69 6c 65  pNext;.    while
6860: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
6870: 6e 63 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  nc ){.      Page
6880: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28  rLruLink *pL = (
6890: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28  PagerLruLink *)(
68a0: 26 28 28 75 38 20 2a 29 70 29 5b 69 4f 66 66 5d  &((u8 *)p)[iOff]
68b0: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4c 2d  );.      p = pL-
68c0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
68d0: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53    pList->pFirstS
68e0: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
68f0: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
6900: 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20   pLink->pPrev = 
6910: 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64  0;.}../* .** Add
6920: 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
6930: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6940: 67 65 73 20 66 6f 72 20 74 68 65 20 70 61 67 65  ges for the page
6950: 72 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79  r. If .** memory
6960: 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
6970: 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61 64 64  nabled, also add
6980: 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
6990: 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69 73 74   global .** list
69a0: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a   of free pages..
69b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
69c0: 72 75 4c 69 73 74 41 64 64 28 50 67 48 64 72 20  ruListAdd(PgHdr 
69d0: 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 41 64 64  *pPg){.  listAdd
69e0: 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c  (&pPg->pPager->l
69f0: 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20  ru, &pPg->free, 
6a00: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
6a10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6a20: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
6a30: 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d  f( !pPg->pPager-
6a40: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
6a50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6a60: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
6a70: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6a80: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6a90: 20 20 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69     listAdd(&sqli
6aa0: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20  te3LruPageList, 
6ab0: 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67  &pPg->gfree, pPg
6ac0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6ad0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6ae0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
6af0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6b00: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6b10: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d  if.}../* .** Rem
6b20: 6f 76 65 20 70 61 67 65 20 70 50 67 20 66 72 6f  ove page pPg fro
6b30: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  m the list of fr
6b40: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
6b50: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
6b60: 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d  r..** If memory-
6b70: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6b80: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f  abled, also remo
6b90: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6ba0: 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f  global list.** o
6bb0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6bc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6bd0: 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72  ListRemove(PgHdr
6be0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65   *pPg){.  listRe
6bf0: 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65  move(&pPg->pPage
6c00: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6c10: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6c20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6c30: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6c40: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6c50: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6c60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6c70: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
6c80: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
6c90: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6ca0: 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76  );.    listRemov
6cb0: 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  e(&sqlite3LruPag
6cc0: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6cd0: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6ce0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6cf0: 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  e(sqlite3MutexAl
6d00: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6d10: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6d20: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
6d30: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6d40: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  n is called just
6d50: 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64 53   after the needS
6d60: 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  ync flag has bee
6d70: 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f  n cleared.** fro
6d80: 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61  m all pages mana
6d90: 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28 75  ged by pPager (u
6da0: 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74  sually because t
6db0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
6dc0: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
6dd0: 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64   synced). It upd
6de0: 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72 2d  ates the pPager-
6df0: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6e00: 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e  d variable.** an
6e10: 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  d, if memory-man
6e20: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6e30: 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c  ed, the sqlite3L
6e40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6e50: 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61  tSynced.** varia
6e60: 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61  ble also..*/.sta
6e70: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6e80: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 50  SetFirstSynced(P
6e90: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6ea0: 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
6eb0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
6ec0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
6ed0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6ee0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6ef0: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
6f00: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
6f10: 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
6f20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6f30: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
6f40: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
6f50: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6f60: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
6f70: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6f80: 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e  First; p && p->n
6f90: 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66  eedSync; p=p->gf
6fa0: 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20  ree.pNext);.    
6fb0: 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72  assert(p==pPager
6fc0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
6fd0: 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33  ed || p==sqlite3
6fe0: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
6ff0: 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73  stSynced);.    s
7000: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
7010: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  t.pFirstSynced =
7020: 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   p;.    sqlite3_
7030: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
7040: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
7050: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7060: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
7070: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
7080: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
7090: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
70a0: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
70b0: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
70c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
70d0: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
70e0: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
70f0: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
7100: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
7110: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
7120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7130: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
7140: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7150: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7160: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
7170: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
7180: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
7190: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
71a0: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
71b0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
71c0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
71d0: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
71e0: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
71f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7200: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7210: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
7220: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
7230: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
7240: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
7250: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
7260: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
7270: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7280: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
7290: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
72a0: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
72b0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66 64  N-1))==0 );.#ifd
72c0: 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43  ef SQLITE_MALLOC
72d0: 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69 66  _SOFT_LIMIT.  if
72e0: 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73 68  ( N*sizeof(aHash
72f0: 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c 4c  [0])>SQLITE_MALL
7300: 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29 7b  OC_SOFT_LIMIT ){
7310: 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45 5f  .    N = SQLITE_
7320: 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49  MALLOC_SOFT_LIMI
7330: 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  T/sizeof(aHash[0
7340: 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 3d  ]);.  }.  if( N=
7350: 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
7360: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
7370: 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
7380: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
7390: 65 72 2d 3e 61 48 61 73 68 21 3d 30 20 29 20 73  er->aHash!=0 ) s
73a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
73b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 61 48 61  nMalloc();.  aHa
73c0: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
73d0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
73e0: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
73f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
7400: 68 21 3d 30 20 29 20 73 71 6c 69 74 65 33 45 6e  h!=0 ) sqlite3En
7410: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
7420: 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
7430: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61  ager);.  if( aHa
7440: 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  sh==0 ){.    /* 
7450: 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73  Failure to rehas
7460: 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f  h is not an erro
7470: 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61  r.  It is only a
7480: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
7490: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  . */.    return;
74a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
74b0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
74c0: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48  h);.  pPager->nH
74d0: 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65  ash = N;.  pPage
74e0: 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68  r->aHash = aHash
74f0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
7500: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7510: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
7520: 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  ){.    int h;.  
7530: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
7540: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
7550: 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
7560: 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
7570: 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
7580: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
7590: 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d    }.    h = pPg-
75a0: 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20  >pgno & (N-1);. 
75b0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
75c0: 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20  h = aHash[h];.  
75d0: 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29    if( aHash[h] )
75e0: 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d  {.      aHash[h]
75f0: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
7600: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61  g;.    }.    aHa
7610: 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
7620: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
7630: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
7640: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
7650: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
7660: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
7670: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
7680: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
7690: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
76a0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
76b0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
76c0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
76d0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
76e0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
76f0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
7700: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
7710: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
7720: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
7730: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
7740: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
7750: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
7760: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
7770: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7780: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
7790: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
77a0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
77b0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
77c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
77d0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
77e0: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
77f0: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
7800: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
7810: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
7820: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
7830: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
7840: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
7850: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
7860: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
7870: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
7880: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
7890: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
78a0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
78b0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
78c0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
78d0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
78e0: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
78f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
7900: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
7910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7920: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
7930: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
7940: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
7950: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
7960: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
7970: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
7980: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7990: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
79a0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  t);.}../*.** If 
79b0: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
79c0: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
79d0: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
79e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
79f0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
7a00: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
7a10: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64  ock){.  if( !pFd
7a20: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
7a30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a40: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
7a50: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
7a60: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
7a70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7a80: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
7a90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
7aa0: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
7ab0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
7ac0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
7ad0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
7ae0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
7af0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
7b00: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
7b10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7b20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7b30: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
7b40: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
7b50: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
7b60: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
7b70: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
7b80: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
7b90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
7ba0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
7bb0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
7bc0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
7bd0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
7be0: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
7bf0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
7c00: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
7c10: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
7c20: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
7c30: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7c40: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
7c50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7c60: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
7c70: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
7c80: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
7c90: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
7ca0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7cb0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
7cc0: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
7cd0: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
7ce0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
7cf0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dc;           /*
7d00: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
7d10: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  ristics */.  int
7d20: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f   nSector;      /
7d30: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
7d40: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20  .  int szPage;  
7d50: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
7d60: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ze */.  sqlite3_
7d70: 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
7d80: 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64  r->fd;..  if( fd
7d90: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
7da0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
7db0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7dc0: 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e  stics(fd);.    n
7dd0: 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Sector = sqlite3
7de0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29  OsSectorSize(fd)
7df0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
7e00: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e10: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e20: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e30: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7e40: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7e50: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7e60: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7e70: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7e80: 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20  hods || .       
7e90: 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f  (dc & (SQLITE_IO
7ea0: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
7eb0: 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74  ge>>8)) && nSect
7ec0: 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20  or<=szPage) ){. 
7ed0: 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41     return JOURNA
7ee0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7ef0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
7f00: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7f10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
7f20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
7f30: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
7f40: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
7f50: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
7f60: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
7f70: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
7f80: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
7f90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7fa0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
7fb0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
7fc0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
7fd0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
7fe0: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
7ff0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
8000: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
8010: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
8020: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8030: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
8040: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
8050: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
8060: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
8070: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
8080: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
8090: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
80a0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
80b0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
80c0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
80d0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
80e0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
80f0: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
8100: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
8110: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
8120: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
8130: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
8140: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
8150: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
8160: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
8170: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
8180: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
8190: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
81a0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
81b0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
81c0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
81d0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
81e0: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
81f0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
8200: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
8210: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
8220: 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74   occured, then t
8230: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
8240: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
8250: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a  to be replayed..
8260: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8270: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
8280: 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74  r *pPager);.stat
8290: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
82a0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
82b0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
82c0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
82d0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
82e0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
82f0: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
8300: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
8310: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
8320: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
8330: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8340: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
8350: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
8360: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
8370: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
8380: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
8390: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
83a0: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
83b0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
83c0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
83d0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
83e0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20  PAGER_UNLOCK && 
83f0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
8400: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
8410: 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
8420: 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61  ady unlocked, ca
8430: 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ll pager_unlock(
8440: 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a  ) now to.      *
8450: 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  * clear the erro
8460: 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75  r state and ensu
8470: 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
8480: 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20  r-cache is .    
8490: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20    ** completely 
84a0: 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  empty..      */.
84b0: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
84c0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
84d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
84e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
84f0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8500: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
8510: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
8520: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
8530: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
8540: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
8550: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
8560: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
8570: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
8580: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
8590: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
85a0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
85b0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
85c0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
85d0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
85e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
85f0: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
8600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8610: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
8620: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
8630: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
8640: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
8650: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
8660: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
8670: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
8680: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
8690: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
86a0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
86b0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
86c0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
86d0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20  r->pageSize, .  
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86f0: 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20        (unsigned 
8700: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
8710: 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a  DATA(pPage));.}.
8720: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
8730: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
8740: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
8750: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
8760: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8770: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
8780: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
8790: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
87a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
87b0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
87c0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
87d0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
87e0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
87f0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
8800: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
8810: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
8820: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
8830: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
8840: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
8850: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
8860: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
8870: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
8880: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
8890: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
88a0: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
88b0: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
88c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
88d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
88e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
88f0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
8900: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
8910: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
8920: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
8930: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
8940: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
8950: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
8960: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
8970: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
8980: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
8990: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
89a0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
89b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
89c0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
89d0: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
89e0: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
89f0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
8a00: 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20   .**.** zMaster 
8a10: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
8a20: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
8a30: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
8a40: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
8a50: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
8a60: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
8a70: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
8a80: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
8a90: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
8aa0: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
8ab0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8ac0: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
8ad0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8ae0: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
8af0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
8b00: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
8b10: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
8b20: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
8b30: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
8b40: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
8b50: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
8b60: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
8b70: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
8b80: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
8b90: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
8ba0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
8bb0: 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72   present zMaster
8bc0: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
8bd0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
8be0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
8bf0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
8c00: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
8c10: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
8c20: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69  char *zMaster, i
8c30: 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  nt nMaster){.  i
8c40: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
8c50: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75  ;.  i64 szJ;.  u
8c60: 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20  32 cksum;.  int 
8c70: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
8c80: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
8c90: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
8ca0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
8cb0: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72  er */..  zMaster
8cc0: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72  [0] = '\0';..  r
8cd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8ce0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
8cf0: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
8d00: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
8d10: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
8d20: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8d30: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
8d40: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
8d50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8d60: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
8d70: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a  len>=nMaster ){.
8d80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8d90: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
8da0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
8db0: 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
8dc0: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
8dd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8de0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
8df0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
8e00: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
8e10: 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  J-8);.  if( rc!=
8e20: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
8e30: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
8e40: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
8e50: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
8e60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8e70: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
8e80: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
8e90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8ea0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
8eb0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a  turn rc;.  }.  z
8ec0: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
8ed0: 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66  0';..  /* See if
8ee0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
8ef0: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
8f00: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
8f10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
8f20: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
8f30: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um -= zMaster[i]
8f40: 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ;.   }.  if( cks
8f50: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
8f60: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
8f70: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
8f80: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
8f90: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
8fa0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
8fb0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
8fc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
8fd0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
8fe0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
8ff0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
9000: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
9010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
9020: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
9030: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
9040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
9050: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61  ..    */.    zMa
9060: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
9070: 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e    }.   .  return
9080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9090: 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f  *.** Seek the jo
90a0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
90b0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  iptor to the nex
90c0: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
90d0: 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75  y where a.** jou
90e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20  rnal header may 
90f0: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
9100: 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  en. Pager.journa
9110: 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20  lOff is updated 
9120: 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20  with.** the new 
9130: 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a  seek offset..**.
9140: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
9150: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
9160: 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66  .**.** Input Off
9170: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
9180: 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a   Output Offset.*
9190: 2a 20 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20  ---------.** 0  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20         0.** 512 
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30        512.** 100
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9210: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30         512.** 20
9220: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
9230: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
9240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9250: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
9260: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9270: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
9280: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
9290: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
92a0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
92b0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
92c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
92d0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
92e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
92f0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
9300: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
9310: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
9320: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9330: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
9340: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
9350: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
9360: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
9370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9380: 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a   = offset;.}../*
9390: 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20  .** Write zeros 
93a0: 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72 20  over the header 
93b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
93c0: 69 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20 74  ile.  This has t
93d0: 68 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20  he.** effect of 
93e0: 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
93f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
9400: 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65  d committing the
9410: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
9420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
9430: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
9440: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
9450: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
9460: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9470: 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  OK;.  static con
9480: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
9490: 32 38 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  28];..  if( pPag
94a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
94b0: 7b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69 74  {.    i64 iLimit
94c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
94d0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20  alSizeLimit;..  
94e0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
94f0: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
9500: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
9510: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
9520: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
9530: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
9540: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
9550: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
9560: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9570: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9580: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
9590: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
95a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
95b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
95c0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
95d0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
95e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
95f0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
9600: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
9610: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
9620: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
9630: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
9640: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
9650: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
9660: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
9670: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
9680: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
9690: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
96a0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
96b0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
96c0: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
96d0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
96e0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
96f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
9700: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
9710: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
9720: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
9730: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
9740: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
9750: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
9760: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
9770: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
9780: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
9790: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
97a0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
97b0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
97c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
97d0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
97e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
97f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
9800: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
9810: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
9820: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9830: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
9840: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
9850: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9860: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9870: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
9880: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
9890: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
98a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
98b0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
98c0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
98d0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
98e0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
98f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
9900: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
9910: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
9920: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
9930: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9940: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
9950: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
9960: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
9970: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
9980: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
9990: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
99a0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
99b0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
99c0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
99d0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
99e0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
99f0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
9a00: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
9a10: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
9a20: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
9a30: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
9a40: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
9a50: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
9a60: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
9a70: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
9a80: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
9a90: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
9aa0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
9ab0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
9ac0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
9ad0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
9ae0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
9af0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
9b00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9b10: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
9b20: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
9b30: 63 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65  ce;.  int nHeade
9b40: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  r = pPager->page
9b50: 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69  Size;.  int nWri
9b60: 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64  te;..  if( nHead
9b70: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
9b80: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
9b90: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
9ba0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9bb0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
9bc0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
9bd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
9be0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
9bf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c00: 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a  ff;.  }..  seekJ
9c10: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
9c20: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
9c30: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
9c40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9c50: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
9c60: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
9c70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9c80: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
9c90: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
9ca0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
9cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
9cc0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
9cd0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
9ce0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
9cf0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
9d00: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
9d10: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
9d20: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
9d30: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
9d40: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
9d50: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
9d60: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
9d70: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
9d80: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
9d90: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
9da0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
9db0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
9dc0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
9dd0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
9de0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
9df0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
9e00: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
9e10: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
9e20: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
9e30: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
9e40: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
9e50: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
9e60: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
9e70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
9e80: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
9e90: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
9ea0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
9eb0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
9ec0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
9ed0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
9ee0: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
9ef0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
9f00: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
9f10: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
9f20: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
9f30: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
9f40: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
9f50: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
9f60: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
9f70: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
9f80: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
9f90: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
9fa0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
9fb0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
9fc0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
9fd0: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
9fe0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
9ff0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
a000: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
a010: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
a020: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
a030: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
a040: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
a050: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
a060: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
a070: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
a080: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
a090: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
a0a0: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
a0b0: 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20  >noSync) .   || 
a0c0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
a0d0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
a0e0: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
a0f0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
a100: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
a110: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a120: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a130: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
a140: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
a150: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
a160: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
a170: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
a180: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
a190: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
a1a0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
a1b0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
a1c0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
a1d0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a1e0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
a1f0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
a200: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
a210: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
a220: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
a230: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
a240: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
a250: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
a260: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a270: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a280: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
a290: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
a2a0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
a2b0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
a2c0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
a2d0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
a2e0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
a2f0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
a300: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
a310: 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
a320: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20  ->journalHdr==0 
a330: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
a340: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70  ge size */.    p
a350: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
a360: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
a370: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
a380: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a390: 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74    }..  for(nWrit
a3a0: 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e=0; rc==SQLITE_
a3b0: 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e  OK&&nWrite<JOURN
a3c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a3d0: 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64  ); nWrite+=nHead
a3e0: 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  er){.    IOTRACE
a3f0: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
a400: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
a410: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
a420: 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20  r, nHeader)).   
a430: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
a440: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
a450: 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64  , zHeader, nHead
a460: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
a470: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61  nalOff);.    pPa
a480: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
a490: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
a4a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a4b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
a4c0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
a4d0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
a4e0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
a4f0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
a500: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
a510: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
a520: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
a530: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
a540: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
a550: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
a560: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
a570: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
a580: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
a590: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
a5a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
a5b0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
a5c0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
a5d0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
a5e0: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
a5f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
a600: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
a610: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
a620: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
a630: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
a640: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
a650: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
a660: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
a670: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
a680: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
a690: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
a6a0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
a6b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a6c0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
a6d0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
a6e0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
a6f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
a700: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
a710: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
a720: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
a730: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
a740: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
a750: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
a760: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
a770: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
a780: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
a790: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
a7a0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
a7b0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
a7c0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
a7d0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
a7e0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
a7f0: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
a800: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
a810: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
a820: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
a830: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
a840: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
a850: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
a860: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
a870: 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  er */.  i64 jrnl
a880: 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65  Off;.  int iPage
a890: 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75  Size;..  seekJou
a8a0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
a8b0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
a8c0: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
a8d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a8e0: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
a8f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a900: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
a910: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
a920: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
a930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a940: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
a950: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
a960: 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  aMagic), jrnlOff
a970: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a980: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
a990: 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61  ff += sizeof(aMa
a9a0: 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  gic);..  if( mem
a9b0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
a9c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
a9d0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
a9e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a9f0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
aa00: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
aa10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
aa20: 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20  lOff, pNRec);.  
aa30: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
aa40: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
aa50: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
aa60: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26  fd, jrnlOff+4, &
aa70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
aa80: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
aa90: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
aaa0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
aab0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
aac0: 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  f+8, pDbSize);. 
aad0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
aae0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
aaf0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
ab00: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c  jfd, jrnlOff+16,
ab10: 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69   (u32 *)&iPageSi
ab20: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ze);.  if( rc==S
ab30: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
ab40: 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a  iPageSize>=512 .
ab50: 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c     && iPageSize<
ab60: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
ab70: 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69  _SIZE .   && ((i
ab80: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
ab90: 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a  eSize)==0 .  ){.
aba0: 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65      u16 pagesize
abb0: 20 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20   = iPageSize;.  
abc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
abd0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
abe0: 50 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65  Pager, &pagesize
abf0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20  );.  }.  if( rc 
ac00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ac10: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
ac20: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
ac30: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
ac40: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
ac50: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
ac60: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
ac70: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
ac80: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
ac90: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
aca0: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
acb0: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
acc0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
acd0: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
ace0: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
acf0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
ad00: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
ad10: 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e  e.  ** of Pager.
ad20: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
ad30: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
ad40: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
ad50: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  e..  */.  rc = r
ad60: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ad70: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31  ->jfd, jrnlOff+1
ad80: 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65  2, (u32 *)&pPage
ad90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
ada0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
adb0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
adc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
add0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ade0: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
adf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
ae00: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
ae10: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
ae20: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
ae30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ae40: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
ae50: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
ae60: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
ae70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ae80: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
ae90: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
aea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
aeb0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
aec0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
aed0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
aee0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
aef0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
af00: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
af10: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
af20: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
af30: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
af40: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
af50: 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79  is:.**.** + 4 by
af60: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
af70: 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73  NO..** + N bytes
af80: 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74  : length of mast
af90: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
afa0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  .** + 4 bytes: N
afb0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  .** + 4 bytes: M
afc0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
afd0: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
afe0: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
aff0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
b000: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
b010: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
b020: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
b030: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
b040: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
b050: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  nal name..**.** 
b060: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
b070: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
b080: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
b090: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
b0a0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
b0b0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
b0c0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
b0d0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
b0e0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
b0f0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
b100: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
b110: 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20  c;.  int len; . 
b120: 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a   int i; .  i64 j
b130: 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72  rnlOff;.  i64 jr
b140: 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b  nlSize;.  u32 ck
b150: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
b160: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
b170: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
b180: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
b190: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
b1a0: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
b1b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
b1c0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
b1d0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
b1e0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
b1f0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
b200: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
b210: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
b220: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
b230: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
b240: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
b250: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
b260: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
b270: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b280: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
b290: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
b2a0: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
b2b0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
b2c0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
b2d0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
b2e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
b2f0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
b300: 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48      seekJournalH
b310: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  dr(pPager);.  }.
b320: 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67    jrnlOff = pPag
b330: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
b340: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b350: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
b360: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
b370: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
b380: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45  d, jrnlOff, PAGE
b390: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
b3a0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
b3b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
b3c0: 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b   rc;.  jrnlOff +
b3d0: 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 4;..  rc = sql
b3e0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
b3f0: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
b400: 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b  , len, jrnlOff);
b410: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b420: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
b430: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c  ;.  jrnlOff += l
b440: 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73  en;..  put32bits
b450: 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70  (zBuf, len);.  p
b460: 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34  ut32bits(&zBuf[4
b470: 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d  ], cksum);.  mem
b480: 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a  cpy(&zBuf[8], aJ
b490: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
b4a0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
b4b0: 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c));.  rc = sqli
b4c0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b4d0: 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b  r->jfd, zBuf, 8+
b4e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
b4f0: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
b500: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b  .  jrnlOff += 8+
b510: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
b520: 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d  agic);.  pPager-
b530: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
b540: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20  ger->noSync;..  
b550: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
b560: 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
b570: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
b580: 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
b590: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
b5a0: 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
b5b0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
b5c0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
b5d0: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
b5e0: 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
b5f0: 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
b600: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
b610: 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
b620: 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
b630: 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
b640: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
b650: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
b660: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
b670: 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
b680: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
b690: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
b6a0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b6b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
b6c0: 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
b6d0: 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
b6e0: 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
b6f0: 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
b700: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
b710: 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
b720: 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
b730: 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d   */ .  if( (rc==
b740: 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26  SQLITE_OK).   &&
b750: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
b760: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
b770: 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
b780: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  )==SQLITE_OK.   
b790: 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c  && jrnlSize>jrnl
b7a0: 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
b7b0: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
b7c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
b7d0: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20   jrnlOff);.  }. 
b7e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b7f0: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
b800: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
b810: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
b820: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
b830: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
b840: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
b850: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
b860: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
b870: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
b880: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
b890: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
b8a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
b8b0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
b8c0: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
b8d0: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
b8e0: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
b8f0: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
b900: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
b910: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
b920: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
b930: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
b940: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b950: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
b960: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
b970: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
b980: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b990: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b9a0: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
b9b0: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
b9c0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
b9d0: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
b9e0: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
b9f0: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
ba00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ba10: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
ba20: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
ba30: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
ba40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
ba50: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
ba60: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
ba70: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
ba80: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
ba90: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
baa0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
bab0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
bac0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
bad0: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
bae0: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
baf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
bb00: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
bb10: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
bb20: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
bb30: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
bb40: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
bb50: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
bb60: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
bb70: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
bb80: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
bb90: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
bba0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
bbb0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
bbc0: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
bbd0: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
bbe0: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
bbf0: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
bc00: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
bc10: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
bc20: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
bc30: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
bc40: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
bc50: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
bc60: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
bc70: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
bc80: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
bc90: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
bca0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
bcb0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
bcc0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
bcd0: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
bce0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
bcf0: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
bd00: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
bd10: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
bd20: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
bd30: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
bd40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bd50: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
bd60: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
bd70: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
bd80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
bd90: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
bda0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
bdb0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
bdc0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49  Pg=pNext){.    I
bdd0: 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
bde0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
bdf0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
be00: 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
be10: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
be20: 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70  ee_count);.    p
be30: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
be40: 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73  tAll;.    lruLis
be50: 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
be60: 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
be70: 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pPg->pData);. 
be80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
be90: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pPg);.  }.  asse
bea0: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
beb0: 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73  First==0);.  ass
bec0: 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
bed0: 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29  pFirstSynced==0)
bee0: 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
bef0: 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29  r->lru.pLast==0)
bf00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
bf10: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
bf20: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
bf30: 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
bf40: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
bf50: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
bf60: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  free(pPager->aHa
bf70: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
bf80: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
bf90: 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20  er->aHash = 0;. 
bfa0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
bfb0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  0;.}../*.** Unlo
bfc0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
bfd0: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
bfe0: 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
bff0: 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20  rently in error 
c000: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74  state, discard t
c010: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a  he contents of .
c020: 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ** the cache and
c030: 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72   reset the Pager
c040: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72   structure inter
c050: 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68  nal state. If th
c060: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65  ere is.** an ope
c070: 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20  n journal-file, 
c080: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69  then the next ti
c090: 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  me a shared-lock
c0a0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
c0b0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  on the pager fil
c0c0: 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e  e (by this or an
c0d0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29  y other process)
c0e0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  , it will be.** 
c0f0: 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74  treated as a hot
c100: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
c110: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
c120: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
c130: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
c140: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
c150: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c160: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d  de ){.    if( !M
c170: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e  EMDB ){.      in
c180: 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28  t rc = osUnlock(
c190: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
c1a0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
c1b0: 72 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72  rc ) pPager->err
c1c0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 20  Code = rc;.     
c1d0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
c1e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52  = -1;.      IOTR
c1f0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
c200: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
c210: 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c      /* Always cl
c220: 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
c230: 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
c240: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
c250: 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  lock..      ** O
c260: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
c270: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
c280: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
c290: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
c2a0: 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
c2b0: 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e  file out from un
c2c0: 64 65 72 20 75 73 2e 0a 20 20 20 20 20 20 2a 2f  der us..      */
c2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
c2e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
c2f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c300: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c310: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 70  >jfd);.        p
c320: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c330: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
c340: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
c350: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
c360: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
c370: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c380: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
c390: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 50  }..      /* If P
c3a0: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
c3b0: 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
c3c0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
c3d0: 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
c3e0: 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e       ** trusted.
c3f0: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c400: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c410: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c420: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ts of the.      
c430: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
c440: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
c450: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
c460: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
c470: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c480: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c490: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
c4a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
c4b0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c4c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c4d0: 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
c4e0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
c4f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
c500: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  tOpen ){.       
c510: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c520: 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
c530: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c540: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
c550: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
c560: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
c570: 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b  er->pInStmt = 0;
c580: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c590: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
c5a0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pen = 0;.       
c5b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
c5c0: 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  se = 0;.        
c5d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c5e0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
c5f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c600: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
c610: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
c620: 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
c630: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
c640: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
c650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c660: 20 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70   if( !MEMDB || p
c670: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
c680: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c690: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
c6a0: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
c6b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63  .      pPager->c
c6c0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
c6d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
c6e0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
c6f0: 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
c700: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
c710: 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
c720: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
c730: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
c740: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
c750: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
c760: 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20  r state, .** do 
c770: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65 20  not attempt the 
c780: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  rollback..*/.sta
c790: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
c7a0: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
c7b0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 2f 2a 20  Pager *p){.  /* 
c7c0: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
c7d0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
c7e0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
c7f0: 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 69 66  en==0 ); */.  if
c800: 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ( p->errCode==SQ
c810: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74  LITE_OK && p->st
c820: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
c830: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
c840: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
c850: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
c860: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
c870: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
c880: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
c890: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
c8a0: 6c 6f 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20  lock(p);.#if 0. 
c8b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
c8c0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
c8d0: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
c8e0: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
c8f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
c900: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
c910: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
c920: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
c930: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64  siveMode );.#end
c940: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
c950: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
c960: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
c970: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
c980: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
c990: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
c9a0: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
c9b0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
c9c0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
c9d0: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
c9e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
c9f0: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
ca00: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
ca10: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
ca20: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
ca30: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
ca40: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
ca50: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
ca60: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
ca70: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
ca80: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
ca90: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
caa0: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
cab0: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
cac0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
cad0: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
cae0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
caf0: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
cb00: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
cb10: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
cb20: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
cb30: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
cb40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
cb50: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
cb60: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
cb70: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
cb80: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
cb90: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
cba0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
cbb0: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
cbc0: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
cbd0: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
cbe0: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
cbf0: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
cc00: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
cc10: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
cc20: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
cc30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc40: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
cc50: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
cc60: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
cc70: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
cc80: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
cc90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
cca0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
ccb0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
ccc0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
ccd0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
cce0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
ccf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cd00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
cd10: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
cd20: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
cd30: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
cd40: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
cd50: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  veMode ){.    sq
cd60: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cd70: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
cd80: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
cd90: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
cda0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cdb0: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pen ){.    if( p
cdc0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cdd0: 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50  Mode .     || pP
cde0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
cdf0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ce00: 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
ce10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
ce20: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
ce30: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
ce40: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
ce50: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
ce60: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
ce70: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
ce80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ce90: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
cea0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ceb0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
cec0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
ced0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cee0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
cef0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cf00: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
cf10: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
cf20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cf30: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cf40: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cf50: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cf60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cf70: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
cf80: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
cf90: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
cfa0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cfb0: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
cfc0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
cfd0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
cfe0: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
cff0: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
d000: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
d010: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
d020: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
d030: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c  0;.      pPg->al
d040: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
d050: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d060: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
d070: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
d080: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
d090: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
d0a0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
d0b0: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
d0c0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
d0d0: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
d0e0: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
d0f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
d100: 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
d110: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a  urnal==0 );.  }.
d120: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
d130: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
d140: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
d150: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
d160: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
d170: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
d180: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
d190: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
d1a0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
d1b0: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
d1c0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
d1d0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
d1e0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
d1f0: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
d200: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
d210: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
d220: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
d230: 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74   lruListSetFirst
d240: 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a  Synced(pPager);.
d250: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
d260: 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d   = -1;.  pPager-
d270: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
d280: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
d290: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
d2a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
d2b0: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
d2c0: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
d2d0: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
d2e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
d2f0: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
d300: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
d310: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
d320: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
d330: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
d340: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
d350: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
d360: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
d370: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
d380: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
d390: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
d3a0: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
d3b0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
d3c0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
d3d0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
d3e0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
d3f0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
d400: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
d410: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
d420: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
d430: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
d440: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
d450: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
d460: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
d470: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
d480: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
d490: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
d4a0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
d4b0: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
d4c0: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
d4d0: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
d4e0: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
d4f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
d500: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
d510: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
d520: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
d530: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
d540: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
d550: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
d560: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
d570: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
d580: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
d590: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
d5a0: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
d5b0: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
d5c0: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
d5d0: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
d5e0: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
d5f0: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
d600: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
d610: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
d620: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
d630: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
d640: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
d650: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
d660: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
d670: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
d680: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
d690: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
d6a0: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
d6b0: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
d6c0: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
d6d0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
d6e0: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
d6f0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
d700: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
d710: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
d720: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
d730: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d740: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d750: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d760: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d770: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20  rn cksum;.}../* 
d780: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
d790: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion */.static vo
d7a0: 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
d7b0: 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  dr*);../*.** Rea
d7c0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
d7d0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d7e0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
d7f0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
d800: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
d810: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
d820: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
d830: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
d840: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
d850: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
d860: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
d870: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
d880: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
d890: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
d8a0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
d8b0: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
d8c0: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
d8d0: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
d8e0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
d8f0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d900: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
d910: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  , .  sqlite3_fil
d920: 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66  e *jfd,.  i64 of
d930: 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43  fset,.  int useC
d940: 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ksum.){.  int rc
d950: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
d980: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
d990: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
d9a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
d9b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
d9c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
d9d0: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
d9e0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
da10: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
da20: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  cking */.  u8 *a
da30: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61  Data = (u8 *)pPa
da40: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
da50: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
da60: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
da70: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
da80: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
da90: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
daa0: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
dab0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
dac0: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
dad0: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
dae0: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
daf0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
db00: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
db10: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
db20: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
db30: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
db40: 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  );..  rc = read3
db50: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
db60: 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
db70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
db90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
dba0: 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  (jfd, aData, pPa
dbb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
dbc0: 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20  ffset+4);.  if( 
dbd0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
dbe0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
dbf0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
dc00: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
dc10: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
dc20: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
dc30: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
dc40: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
dc50: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
dc60: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
dc70: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
dc80: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
dc90: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
dca0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
dcb0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
dcc0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
dcd0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
dce0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
dcf0: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
dd00: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
dd10: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
dd20: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
dd30: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
dd40: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
dd50: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
dd60: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
dd70: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
dd80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
dd90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
dda0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
ddb0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
ddc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ddd0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
dde0: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
ddf0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
de00: 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d  , offset+pPager-
de10: 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
de20: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
de30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
de40: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
de50: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
de60: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
de70: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
de80: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
de90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
dea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
deb0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
dec0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
ded0: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
dee0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
def0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
df00: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
df10: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
df20: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
df30: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
df40: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
df50: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
df60: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
df70: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
df80: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
df90: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
dfa0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
dfb0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
dfc0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
dfd0: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
dfe0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
dff0: 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
e000: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
e010: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
e020: 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
e030: 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
e040: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
e050: 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
e060: 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
e070: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
e080: 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
e090: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
e0a0: 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
e0b0: 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
e0c0: 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
e0d0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e0e0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
e0f0: 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
e100: 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
e110: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
e120: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
e130: 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
e140: 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
e150: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
e160: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
e170: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
e180: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
e190: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
e1a0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
e1b0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e1c0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
e1d0: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
e1e0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
e1f0: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
e200: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
e210: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
e220: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
e230: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
e240: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
e250: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
e260: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
e270: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
e280: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
e290: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
e2a0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
e2b0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
e2c0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
e2d0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
e2e0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
e2f0: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
e300: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
e310: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
e320: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
e330: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
e340: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
e350: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
e360: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
e370: 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
e380: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
e390: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
e3a0: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
e3b0: 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
e3c0: 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
e3d0: 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
e3e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
e3f0: 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
e400: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
e410: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
e420: 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
e430: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
e440: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
e450: 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
e460: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
e470: 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
e480: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
e490: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
e4a0: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
e4b0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
e4c0: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
e4d0: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
e4e0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
e4f0: 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
e500: 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
e510: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
e520: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
e530: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
e540: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
e550: 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
e560: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
e570: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
e580: 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
e590: 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
e5a0: 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
e5b0: 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
e5c0: 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
e5d0: 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
e5e0: 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
e5f0: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
e600: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
e610: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
e620: 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
e630: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
e640: 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
e650: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
e660: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
e670: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
e680: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
e690: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
e6a0: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
e6b0: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
e6c0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
e6d0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
e6e0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e6f0: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
e700: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
e710: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
e720: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  & (pPg==0 || pPg
e730: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20  ->needSync==0). 
e740: 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
e750: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
e760: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
e770: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
e780: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
e790: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
e7a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
e7b0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
e7c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e7d0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  offset);.    if(
e7e0: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61   pPg ){.      ma
e7f0: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
e800: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
e810: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
e820: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
e830: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
e840: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
e850: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
e860: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
e870: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
e880: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
e890: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
e8a0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
e8b0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
e8c0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
e8d0: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
e8e0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
e8f0: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
e900: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
e910: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
e920: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
e930: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
e940: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
e950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
e960: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
e970: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
e980: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
e990: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
e9a0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
e9b0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
e9c0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
e9d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e9e0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
e9f0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
ea00: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
ea10: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
ea20: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ea30: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
ea40: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
ea50: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
ea60: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
ea70: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
ea80: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
ea90: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
eaa0: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
eab0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
eac0: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
ead0: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
eae0: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
eaf0: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
eb00: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
eb10: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
eb20: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
eb30: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
eb40: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
eb50: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
eb60: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
eb70: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
eb80: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
eb90: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
eba0: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
ebb0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
ebc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
ebd0: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
ebe0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
ebf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ec00: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
ec10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
ec20: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
ec30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ec40: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
ec50: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ec60: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
ec70: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
ec80: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
ec90: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
eca0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
ecb0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
ecc0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
ecd0: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
ece0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
ecf0: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
ed00: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
ed10: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
ed20: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
ed30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
ed40: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
ed50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ed60: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
ed70: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
ed80: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
ed90: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
eda0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
edb0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
edc0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
edd0: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
ede0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
edf0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
ee00: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
ee10: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
ee20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
ee30: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
ee40: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
ee50: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
ee60: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
ee70: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
ee80: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
ee90: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
eea0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
eeb0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
eec0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
eed0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
eef0: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
ef00: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
ef10: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
ef20: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
ef30: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
ef40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ef50: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
ef60: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
ef70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
ef80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ef90: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
efa0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
efb0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
efc0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
efd0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
efe0: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
eff0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
f000: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
f010: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
f020: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
f030: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
f040: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
f050: 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  3Malloc(pVfs->sz
f060: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
f070: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
f080: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
f090: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
f0a0: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
f0b0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
f0c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f0d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
f0e0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
f0f0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
f100: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
f110: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
f120: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f130: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
f140: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
f150: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
f160: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f170: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
f180: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
f190: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
f1a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
f1b0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
f1c0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
f1d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f1e0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
f1f0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
f200: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
f210: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
f220: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
f230: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
f240: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
f250: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
f260: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
f270: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
f280: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
f290: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f2a0: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
f2b0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
f2c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
f2d0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
f2e0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
f2f0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
f300: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
f310: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
f320: 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
f330: 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
f340: 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
f350: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
f360: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f370: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f380: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f390: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
f3a0: 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
f3b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
f3c0: 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
f3d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f3e0: 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
f3f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
f400: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
f410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f420: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
f430: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
f440: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
f450: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
f460: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
f470: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
f480: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
f490: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
f4a0: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
f4b0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
f4c0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
f4d0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
f4e0: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
f4f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
f500: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f510: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
f520: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
f530: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
f540: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
f550: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
f560: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
f570: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f580: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
f590: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
f5a0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
f5b0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
f5c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
f5d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
f5e0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
f5f0: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
f600: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
f610: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f620: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
f630: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
f640: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
f650: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
f660: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
f670: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f680: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
f690: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
f6a0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
f6b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f6c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f6d0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f6e0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f6f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
f700: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
f710: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
f720: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
f730: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
f740: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
f750: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
f760: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f780: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f790: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
f7a0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
f7b0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
f7c0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
f7d0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
f7e0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
f7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
f800: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
f810: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
f820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f830: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
f840: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
f850: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
f860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
f870: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
f880: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
f890: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
f8a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
f8b0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f8c0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
f8d0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
f8e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
f8f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f900: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
f910: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
f920: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
f930: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f940: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
f950: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
f960: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
f970: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
f980: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
f990: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
f9a0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
f9b0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
f9c0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
f9d0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
f9e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
f9f0: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
fa00: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
fa10: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
fa20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
fa30: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
fa40: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
fa50: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
fa60: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
fa70: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
fa80: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
fa90: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
faa0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
fab0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
fac0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
fad0: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
fae0: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
faf0: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
fb00: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
fb10: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
fb20: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
fb30: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
fb40: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
fb50: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
fb60: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
fb70: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
fb80: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
fb90: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
fba0: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
fbb0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
fbc0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
fbd0: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
fbe0: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
fbf0: 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
fc00: 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
fc10: 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
fc20: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c  f the new.** fil
fc30: 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74  e instead..*/.st
fc40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
fc50: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
fc60: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
fc70: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fc80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
fc90: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
fca0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
fcb0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
fcc0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34  thods ){.    i64
fcd0: 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
fce0: 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  wSize;.    rc = 
fcf0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fd00: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
fd10: 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
fd20: 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
fd30: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
fd40: 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
fd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
fd60: 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
fd70: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
fd80: 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
fd90: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
fda0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fdb0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
fdc0: 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
fdd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fde0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fdf0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
fe00: 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
fe10: 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
fe20: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
fe30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fe40: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
fe50: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
fe60: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
fe70: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
fe80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fe90: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fea0: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
feb0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
fec0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
fed0: 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73   size is at leas
fee0: 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65 20  t as big as the 
fef0: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
ff00: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
ff10: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
ff20: 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
ff30: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31  ector size is 51
ff40: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
ff50: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
ff60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ff70: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
ff80: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
ff90: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
ffa0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
ffb0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
ffc0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
ffd0: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
ffe0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
fff0: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
10000 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
10010 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
10020 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
10030 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
10040 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
10050 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
10060 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
10070 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
10080 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
10090 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
100a0 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
100b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
100c0 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
100d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
100e0 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = 512;.  }.}../*
100f0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
10100 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
10110 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
10120 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
10130 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
10140 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
10150 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
10160 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
10170 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10180 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
10190 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
101a0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
101b0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
101c0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
101d0 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
101e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
101f0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10200 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
10210 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
10220 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
10230 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
10240 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
10250 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
10260 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
10270 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
10280 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
10290 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
102a0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
102b0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
102c0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
102d0 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
102e0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
102f0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
10300 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
10310 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
10320 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10330 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10340 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
10350 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
10360 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
10370 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
10380 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
10390 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
103a0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
103b0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
103c0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
103d0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
103e0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
103f0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
10400 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
10410 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
10420 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
10430 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10440 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
10450 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
10460 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
10470 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
10480 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
10490 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
104a0 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
104b0 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
104c0 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
104d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
104e0 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
104f0 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
10500 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
10510 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
10520 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
10530 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
10540 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
10550 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
10560 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
10570 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
10580 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
10590 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
105a0 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
105b0 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
105c0 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
105d0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
105e0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
105f0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
10600 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
10610 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
10620 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
10630 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10640 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
10650 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
10660 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
10670 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
10680 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
10690 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
106a0 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
106b0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
106c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
106d0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
106e0 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
106f0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
10700 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
10710 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
10720 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
10730 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
10740 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
10750 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
10760 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
10770 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
10780 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
10790 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
107a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
107b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
107c0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
107d0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
107e0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
107f0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
10800 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
10810 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
10820 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
10830 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10840 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
10850 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
10860 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
10870 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
10880 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
10890 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
108a0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
108b0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
108c0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
108d0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
108e0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
108f0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
10900 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
10910 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
10920 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
10930 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
10940 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
10950 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
10960 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
10970 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
10980 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
10990 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
109a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
109b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
109c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
109d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
109e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
109f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
10a00 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
10a10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
10a20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
10a30 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
10a40 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
10a50 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
10a60 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
10a70 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
10a80 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
10a90 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
10aa0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
10ab0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
10ac0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
10ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
10ae0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
10af0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
10b00 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
10b10 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
10b20 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
10b30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10b40 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
10b50 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10b60 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
10b70 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
10b80 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
10b90 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
10ba0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
10bb0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
10bc0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
10bd0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
10be0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
10bf0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
10c00 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
10c10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10c20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
10c30 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
10c40 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
10c50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
10c60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
10c70 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
10c80 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
10cc0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
10cd0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
10ce0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10cf0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
10d00 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
10d10 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10d20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10d30 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
10d40 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
10d50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10d60 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
10d70 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
10d80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10d90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
10da0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
10db0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10dc0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
10dd0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
10de0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
10df0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
10e00 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
10e10 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
10e20 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
10e30 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
10e40 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
10e50 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
10e60 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
10e70 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
10e80 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
10e90 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
10ea0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
10eb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10ec0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
10ed0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10ee0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10ef0 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
10f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
10f10 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
10f20 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
10f30 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
10f40 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10f50 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
10f60 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
10f70 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
10f80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
10f90 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
10fa0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
10fb0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
10fc0 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
10fd0 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
10fe0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
10ff0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
11000 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
11010 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
11020 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
11030 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
11040 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
11050 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
11060 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
11070 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
11080 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
11090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
110a0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
110b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
110c0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
110d0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
110e0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
110f0 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
11100 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
11110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
11120 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
11130 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11140 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
11150 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
11160 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
11170 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
11180 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
11190 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
111a0 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
111b0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
111c0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
111d0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
111e0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
111f0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
11200 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
11210 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
11220 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
11230 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
11240 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
11250 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
11260 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
11270 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
11280 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
11290 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
112a0 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
112b0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
112c0 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
112d0 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
112e0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
112f0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
11300 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
11310 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
11320 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
11330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11340 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
11350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11360 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
11370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
11390 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
113a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
113b0 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
113c0 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
113d0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
113e0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
113f0 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
11400 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
11410 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
11420 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
11430 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
11440 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
11450 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
11460 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
11470 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
11480 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
11490 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
114a0 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
114b0 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
114c0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
114d0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
114e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
114f0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
11500 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
11510 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
11520 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
11530 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
11540 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
11550 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
11560 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
11570 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
11580 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
11590 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
115a0 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
115b0 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
115c0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
115d0 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
115e0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
115f0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
11600 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
11610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
11620 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
11630 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
11640 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
11650 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
11660 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
11670 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
11680 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
11690 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
116a0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
116b0 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
116c0 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
116d0 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
116e0 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
116f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
11700 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
11710 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
11720 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
11730 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11740 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
11750 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
11760 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
11770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11780 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
11790 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
117a0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
117b0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
117c0 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
117d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
117e0 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
117f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
11800 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
11810 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
11820 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11830 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
11840 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11850 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
11860 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
11870 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
11880 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
118a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
118b0 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
118c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
118d0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
118e0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
118f0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
11900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11910 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
11920 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
11930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
11940 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11950 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11960 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
11970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11980 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
11990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
119a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
119b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
119c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
119d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
119e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
119f0 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
11a00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11a10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11a20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
11a30 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
11a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11a50 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
11a60 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
11a70 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
11a80 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
11a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11aa0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
11ab0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
11ac0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
11ad0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
11ae0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
11af0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
11b00 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a  athname+1);.  }.
11b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
11b30 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
11b40 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
11b50 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
11b60 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
11b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
11b80 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f 2a  ter[0] ){.    /*
11b90 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
11ba0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
11bb0 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
11bc0 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
11bd0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
11be0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
11bf0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
11c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
11c10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
11c20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
11c30 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
11c40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
11c50 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
11c60 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
11c70 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
11c80 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
11c90 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
11ca0 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
11cb0 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
11cc0 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
11cd0 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
11ce0 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
11cf0 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
11d00 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
11d10 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
11d20 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
11d30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11d40 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
11d50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
11d60 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
11d70 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
11d80 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
11d90 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
11da0 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
11db0 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
11dc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
11dd0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
11de0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11df0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
11e00 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
11e10 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
11e20 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
11e30 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
11e40 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
11e50 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
11e60 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
11e70 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
11e80 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
11e90 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
11ea0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
11eb0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
11ec0 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
11ed0 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
11ee0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
11ef0 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
11f00 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
11f10 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
11f20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11f30 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
11f40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11f50 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
11f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
11f70 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
11f80 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
11f90 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
11fa0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11fb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
11fc0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
11fd0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11fe0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
11ff0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
12000 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
12010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
12020 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
12030 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
12040 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20   just after the 
12050 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20  end of the last 
12060 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  journal.  ** pag
12070 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
12080 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
12090 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68  al-header for th
120a0 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  is statement.  *
120b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
120c0 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68  s written, or th
120d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
120e0 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
120f0 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
12100 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
12110 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
12120 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
12130 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
12140 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
12150 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
12160 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
12170 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
12180 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
12190 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
121a0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
121b0 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  size..  */.  rc 
121c0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
121d0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
121e0 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73  >stmtSize);.  as
121f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
12200 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
12210 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  D );..  /* Figur
12220 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
12230 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
12240 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
12250 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
12260 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
12270 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72 2d  InUse && pPager-
12280 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12290 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
122a0 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
122b0 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
122c0 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
122d0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
122e0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
122f0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
12300 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
12310 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
12320 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
12330 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
12340 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
12350 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
12360 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
12370 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
12380 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
12390 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
123a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
123b0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  c; i++){.    i64
123c0 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70   offset = i*(4+p
123d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
123e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
123f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
12400 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
12410 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
12420 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
12430 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12440 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
12450 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
12460 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
12470 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
12480 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
12490 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
124a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
124b0 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
124c0 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
124d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
124e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
124f0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
12500 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
12510 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
12520 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
12530 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
12540 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
12550 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
12560 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
12570 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
12580 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
12590 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
125a0 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
125b0 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
125c0 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
125d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
125e0 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
125f0 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
12600 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12610 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50  ction..  */.  pP
12620 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12630 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a   = pPager->stmtJ
12640 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
12650 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67  cksumInit = pPag
12660 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20  er->stmtCksum;. 
12670 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
12680 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72  journalOff < hdr
12690 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Off ){.    rc = 
126a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
126b0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
126c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
126d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
126e0 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
126f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12700 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
12710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
12720 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
12730 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
12740 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12750 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
12760 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
12770 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12780 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
12790 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
127a0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
127b0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
127c0 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
127d0 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
127e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
127f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
12800 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
12810 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
12820 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
12830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12840 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
12850 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
12860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12870 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
12880 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
12890 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
128a0 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
128b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
128c0 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
128d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
128e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
128f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
12900 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
12910 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
12920 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
12930 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
12940 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12950 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
12960 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
12970 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
12980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12990 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
129a0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
129b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
129c0 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
129d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
129e0 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
129f0 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
12a00 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
12a10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12a20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
12a30 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
12a40 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
12a50 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
12a60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12a70 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
12a80 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
12a90 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12aa0 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
12ab0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
12ac0 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
12ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
12ae0 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
12af0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
12b00 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
12b10 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
12b20 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
12b30 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
12b40 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
12b50 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
12b60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
12b70 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
12b80 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
12b90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
12ba0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
12bb0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
12bc0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
12bd0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
12be0 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
12bf0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
12c00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12c10 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
12c20 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
12c30 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
12c40 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
12c50 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
12c60 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
12c70 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
12c80 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
12c90 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
12ca0 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
12cb0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
12cc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12cd0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
12ce0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
12cf0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
12d00 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
12d10 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
12d20 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
12d30 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
12d40 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
12d60 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
12d70 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
12d80 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
12d90 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12da0 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
12db0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12dc0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
12dd0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
12de0 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
12df0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
12e00 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
12e10 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
12e20 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
12e30 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
12e40 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
12e50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12e60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
12e70 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
12e80 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
12e90 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
12ea0 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
12eb0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
12ec0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
12ee0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
12ef0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
12f00 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
12f10 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
12f20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
12f30 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
12f40 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
12f50 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
12f60 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
12f70 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
12f80 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
12f90 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
12fa0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
12fb0 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
12fc0 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
12fd0 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
12fe0 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
12ff0 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
13000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13010 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
13020 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
13030 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
13040 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13050 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
13060 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50  ull_fsync){.  pP
13070 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
13080 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
13090 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
130a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
130b0 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
130c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
130d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
130e0 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f 66  _flags = (full_f
130f0 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
13100 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
13110 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
13120 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
13130 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
13140 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
13150 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
13160 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
13170 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
13180 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
13190 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
131a0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
131b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
131c0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
131d0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
131e0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
131f0 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
13200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
13210 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
13220 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
13230 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
13240 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
13250 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
13260 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
13270 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
13280 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
13290 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
132a0 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
132b0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
132c0 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
132d0 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
132e0 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
132f0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20  mporary.** file 
13300 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
13310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13320 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13330 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
13340 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
13350 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
13360 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
13370 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
13380 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
13390 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
133a0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
133b0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
133c0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
133d0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
133e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
133f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
13400 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
13410 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
13420 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
13430 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
13440 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
13450 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
13460 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
13470 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
13480 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
13490 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
134a0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
134b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
134c0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
134d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
134e0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
134f0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
13500 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
13510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
13520 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
13530 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
13540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
13550 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
13560 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
13570 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
13580 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
13590 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
135a0 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
135b0 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
135c0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
135d0 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
135e0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
135f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
13600 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
13610 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
13620 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
13630 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
13640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
13650 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
13660 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
13670 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
13680 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
13690 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
136a0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
136b0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
136c0 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
136d0 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
136e0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
136f0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
13700 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13710 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13720 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
13730 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
13740 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
13750 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
13760 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
13770 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
13780 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
13790 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
137a0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
137b0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
137c0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
137d0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
137e0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
137f0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
13800 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
13810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13820 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
13830 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
13840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
13850 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
13860 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13870 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
13880 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138a0 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
138b0 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
138c0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
138d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
138e0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
138f0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
13900 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
13910 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
13920 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
13930 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
13940 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
13950 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  n() */.){.  u8 *
13960 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
13970 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Pager = 0;.  int
13980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13990 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
139a0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
139b0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
139c0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
139d0 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
139e0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
139f0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
13a00 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
13a10 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
13a20 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
13a30 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20  LOCK)!=0;.  int 
13a40 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
13a50 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
13a60 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69 6e  Size(pVfs);.  in
13a70 74 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  t szPageDflt = S
13a80 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
13a90 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20  GE_SIZE;.  char 
13aa0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  *zPathname = 0;.
13ab0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
13ac0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
13ad0 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73  efault return is
13ae0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
13af0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
13b00 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
13b10 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
13b20 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
13b30 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
13b40 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
13b50 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
13b60 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
13b70 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
13b80 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
13b90 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
13ba0 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
13bb0 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
13bc0 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
13bd0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
13be0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
13bf0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
13c00 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
13c10 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
13c20 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13c30 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20  (nPathname*2);. 
13c40 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
13c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
13c60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13c70 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
13c90 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
13ca0 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
13cb0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
13cc0 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
13cd0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
13ce0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
13cf0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
13d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13d10 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
13d20 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
13d30 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
13d40 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  thname);.    }. 
13d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
13d80 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
13d90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13da0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74    nPathname = st
13db0 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b  rlen(zPathname);
13dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
13dd0 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
13de0 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
13df0 72 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d  re */.  pPager =
13e00 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
13e10 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a  ro(.    sizeof(*
13e20 70 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20  pPager) +       
13e30 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
13e40 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f  ucture */.    jo
13e50 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20  urnalFileSize + 
13e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13e70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
13e80 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20  ructure */ .    
13e90 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
13ea0 20 33 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 54   3 +        /* T
13eb0 68 65 20 6d 61 69 6e 20 64 62 20 61 6e 64 20 74  he main db and t
13ec0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
13ed0 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61 74 68   */ .    3*nPath
13ee0 6e 61 6d 65 20 2b 20 34 30 20 20 20 20 20 20 20  name + 40       
13ef0 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
13f00 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  e, zDirectory, z
13f10 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
13f20 20 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b    if( !pPager ){
13f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13f40 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
13f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74  NOMEM;.  }.  pPt
13f70 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65  r = (u8 *)&pPage
13f80 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
13f90 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
13fa0 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ags;.  pPager->f
13fb0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
13fc0 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
13fd0 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50  zOsFile*0];.  pP
13fe0 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71  ager->stfd = (sq
13ff0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
14000 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
14010 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  *1];.  pPager->j
14020 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
14030 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
14040 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70  szOsFile*2];.  p
14050 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14060 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b   = (char*)&pPtr[
14070 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32  pVfs->szOsFile*2
14080 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  +journalFileSize
14090 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
140a0 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
140b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
140c0 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
140d0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
140e0 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
140f0 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ory[nPathname+1]
14100 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  ;.  pPager->pVfs
14110 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a   = pVfs;.  if( z
14120 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
14130 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
14140 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
14150 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
14160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14170 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
14180 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
14190 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
141a0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
141b0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
141c0 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
141d0 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
141e0 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
141f0 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
14200 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
14210 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14220 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
14230 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
14240 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
14250 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
14260 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
14270 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
14280 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
142b0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
142c0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
142d0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
142e0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
142f0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
14300 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
14310 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
14320 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
14330 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
14340 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
14350 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
14360 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
14370 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
14380 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
14390 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
143a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
143b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
143c0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
143d0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
143e0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
143f0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
14400 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
14410 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
14420 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
14430 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
14440 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
14450 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
14460 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
14470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14480 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
14490 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
144a0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
144b0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
144c0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
144d0 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
144e0 74 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b  t<iSectorSize ){
144f0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
14500 65 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72 53  eDflt = iSectorS
14510 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ize;.        }.#
14520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14530 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
14540 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
14550 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
14560 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
14570 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
14580 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
14590 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
145a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
145b0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
145c0 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
145d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
145e0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
145f0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
14600 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
14610 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
14620 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
14630 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
14640 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
14650 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
14660 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
14670 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
14680 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
14690 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
146a0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
146b0 28 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67  (ii>>8)) ) szPag
146c0 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = 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 73 7a 50 61 67 65 44 66 6c 74 3e   if( szPageDflt>
14700 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14710 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
14720 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
14730 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
14740 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
14750 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IZE;.        }. 
14760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14770 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62 20  else if( !memDb 
14780 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  ){.    /* If a t
14790 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
147a0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
147b0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
147c0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
147d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
147e0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
147f0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
14800 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
14810 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
14820 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
14830 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
14840 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
14850 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
14860 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
14870 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
14880 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a  EXCLUSIVE;.  }..
14890 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20    if( pPager && 
148a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
148b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
148c0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
148d0 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a 50 61 67  PageMalloc(szPag
148e0 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eDflt);.  }..  /
148f0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
14900 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
14910 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
14920 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74  ove..  ** Free t
14930 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
14940 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
14950 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63   file..  ** Sinc
14960 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
14970 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
14980 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
14990 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
149a0 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
149b0 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
149c0 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70  f( !pPager || !p
149d0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
149e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
149f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
14a00 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
14a10 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
14a20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
14a30 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45  QLITE_OK)?SQLITE
14a40 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a  _NOMEM:rc);.  }.
14a50 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
14a60 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
14a70 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
14a80 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
14a90 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49  >zFilename);.  I
14aa0 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
14ab0 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
14ac0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14ad0 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  e))..  /* Fill i
14ae0 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f  n Pager.zDirecto
14af0 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  ry[] */.  memcpy
14b00 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
14b10 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ory, pPager->zFi
14b20 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
14b30 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74  e+1);.  for(i=st
14b40 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69  rlen(pPager->zDi
14b50 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26 26  rectory); i>0 &&
14b60 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
14b70 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
14b80 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
14b90 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
14ba0 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a  tory[i-1] = 0;..
14bb0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67    /* Fill in Pag
14bc0 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f  er.zJournal[] */
14bd0 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
14be0 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
14bf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
14c00 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
14c10 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
14c20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
14c30 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
14c40 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
14c50 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65 6c 73 65  al", 9);.  }else
14c60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  {.    pPager->zJ
14c70 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ournal = 0;.  }.
14c80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
14c90 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
14ca0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
14cb0 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
14cc0 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
14cd0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
14ce0 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
14cf0 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
14d00 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
14d10 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
14d20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
14d30 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
14d40 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
14d50 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
14d60 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
14d70 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
14d80 69 7a 65 20 3d 20 73 7a 50 61 67 65 44 66 6c 74  ize = szPageDflt
14d90 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
14da0 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
14db0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
14dc0 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
14dd0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
14de0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
14df0 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
14e00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  ;.  pPager->mxPg
14e10 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
14e20 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
14e30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
14e40 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
14e50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
14e60 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
14e70 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
14e80 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
14e90 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
14ea0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14eb0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
14ec0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
14ed0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
14ee0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
14ef0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
14f00 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
14f10 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
14f20 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
14f30 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
14f40 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
14f50 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
14f60 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
14f70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
14f80 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
14f90 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
14fa0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
14fb0 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
14fc0 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
14fd0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
14fe0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
14ff0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
15000 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
15010 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
15020 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
15030 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
15040 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
15050 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
15060 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
15070 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
15080 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
15090 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
150a0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
150b0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
150c0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
150d0 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
150e0 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
150f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
15100 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
15110 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
15120 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
15130 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
15140 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
15150 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65  |memDb||tempFile
15160 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
15170 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72  ){.    setSector
15180 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15190 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
151a0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
151b0 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
151c0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
151d0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
151e0 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
151f0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
15200 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15210 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
15220 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
15230 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
15240 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
15250 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  eDB = 0;.  if( !
15260 6d 65 6d 44 62 20 29 7b 0a 23 69 66 6e 64 65 66  memDb ){.#ifndef
15270 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
15280 4f 50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  OP.    sqlite3_m
15290 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
152a0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
152b0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
152c0 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69  TIC_MEM2);.#endi
152d0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  f.    sqlite3_mu
152e0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
152f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e  ;.    pPager->pN
15300 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ext = sqlite3Pag
15310 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  erList;.    if( 
15320 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
15330 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
15340 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  ( sqlite3PagerLi
15350 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a  st->pPrev==0 );.
15360 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
15370 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20  erList->pPrev = 
15380 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pPager;.    }.  
15390 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20    pPager->pPrev 
153a0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
153b0 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67  PagerList = pPag
153c0 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
153d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
153e0 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  x);.  }.#endif. 
153f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15400 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
15410 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
15420 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
15430 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
15440 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61  etBusyhandler(Pa
15450 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
15460 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
15470 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
15480 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
15490 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
154a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
154b0 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
154c0 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
154d0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
154e0 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
154f0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
15500 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
15510 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
15520 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
15530 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
15540 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
15550 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
15560 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
15570 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
15580 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
15590 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
155a0 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
155b0 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
155c0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
155d0 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
155e0 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
155f0 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  d by sqlite3Page
15600 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  rUnref()..*/.voi
15610 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
15620 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  tDestructor(Page
15630 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
15640 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a  (*xDesc)(DbPage*
15650 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
15660 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
15670 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
15680 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
15690 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
156a0 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
156b0 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
156c0 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
156d0 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
156e0 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
156f0 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
15700 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
15710 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
15720 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
15730 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
15740 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
15750 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
15760 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
15770 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
15780 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
15790 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
157a0 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
157b0 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
157c0 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
157d0 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
157e0 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
157f0 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  it)(DbPage*,int)
15800 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
15810 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
15820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
15830 68 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20  he page size to 
15840 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20 74  *pPageSize. If t
15850 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
15860 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69  age size is.** i
15870 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
15880 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
15890 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
158a0 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61  et to that.** va
158b0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
158c0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
158d0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
158e0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
158f0 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
15900 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ze){.  int rc = 
15910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36  SQLITE_OK;.  u16
15920 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
15930 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
15940 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
15950 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
15960 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
15970 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
15980 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  E) );.  if( page
15990 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
159a0 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
159b0 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61 67 65  ze .   && !pPage
159c0 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67  r->memDb && pPag
159d0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29  er->nRef==0 .  )
159e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77  {.    char *pNew
159f0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
15a00 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
15a10 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
15a20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !pNew ){.      r
15a30 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15a50 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
15a60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ager);.      pag
15a70 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
15a80 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
15a90 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
15aa0 69 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65  ize;.      setSe
15ab0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
15ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
15ad0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
15ae0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
15af0 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
15b00 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
15b10 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
15b20 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
15b30 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
15b40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
15b50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15b60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15b70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
15b80 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
15b90 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
15ba0 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
15bb0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
15bc0 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
15bd0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
15be0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
15bf0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
15c00 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
15c10 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
15c20 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
15c30 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
15c40 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
15c50 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
15c60 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
15c70 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
15c80 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
15c90 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
15ca0 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
15cb0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
15cc0 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
15cd0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
15ce0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
15cf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
15d00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
15d10 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
15d20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
15d30 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
15d40 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
15d50 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
15d60 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
15d70 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
15d80 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
15d90 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
15da0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
15db0 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
15dc0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
15dd0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
15de0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
15df0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
15e00 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
15e10 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
15e20 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
15e30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15e40 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
15e50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
15e60 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15e70 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
15e80 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
15e90 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
15ea0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
15eb0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
15ec0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
15ed0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
15ee0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
15ef0 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
15f00 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
15f10 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
15f20 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
15f30 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
15f40 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
15f50 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
15f60 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
15f70 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
15f80 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
15f90 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
15fa0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
15fb0 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
15fc0 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
15fd0 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
15fe0 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
15ff0 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
16000 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
16010 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
16020 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
16030 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
16040 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
16050 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
16060 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
16070 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
16080 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
16090 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
160a0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
160b0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
160c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
160d0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
160e0 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
160f0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
16100 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
16110 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
16120 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
16130 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
16140 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
16150 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
16160 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
16170 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
16180 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
16190 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
161a0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
161b0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
161c0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
161d0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
161e0 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
161f0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
16200 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
16210 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
16220 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
16230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
16240 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
16250 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
16260 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
16270 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
16280 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
16290 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
162a0 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
162b0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
162c0 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
162d0 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
162e0 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
162f0 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
16300 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
16310 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
16320 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
16330 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
16340 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
16350 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
16360 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
16370 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
16380 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
16390 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
163a0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
163b0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
163c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
163d0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
163e0 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d  , N);.  assert(M
163f0 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64  EMDB||pPager->fd
16400 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
16410 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
16420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
16430 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
16440 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
16450 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
16460 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
16470 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16480 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
16490 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
164a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
164b0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
164c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
164d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
164e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
164f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16500 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
16510 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
16520 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
16530 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
16540 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
16550 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
16560 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
16570 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
16580 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
16590 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
165a0 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
165b0 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
165c0 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
165d0 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
165e0 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
165f0 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
16600 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
16610 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
16620 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
16630 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
16640 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
16650 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
16660 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
16670 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16680 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
16690 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 n = 0;.  int
166a0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
166b0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
166c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
166d0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
166e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
166f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
16700 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
16710 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
16720 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
16730 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50   {.    assert(pP
16740 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
16750 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
16760 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28  File);.    if( (
16770 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
16780 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72  hods).     && (r
16790 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
167a0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
167b0 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
167c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
167d0 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  r->nRef++;.     
167e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
167f0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16800 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
16810 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
16830 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
16840 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
16850 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
16860 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
16870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
16880 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16890 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
168a0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
168b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
168c0 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
168d0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
168e0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
168f0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
16900 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
16910 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
16920 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
16930 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
16940 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
16950 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
16960 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69  QLITE_OK;.}...#i
16980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16990 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
169a0 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
169b0 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
169c0 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
169d0 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
169e0 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
169f0 33 50 61 67 65 46 72 65 65 28 70 48 69 73 74 2d  3PageFree(pHist-
16a00 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
16a10 65 33 50 61 67 65 46 72 65 65 28 70 48 69 73 74  e3PageFree(pHist
16a20 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73  ->pStmt);.  pHis
16a30 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20  t->pOrig = 0;.  
16a40 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
16a50 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
16a60 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78  e clearHistory(x
16a70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16a80 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
16a90 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
16aa0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
16ab0 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e  ger*);../*.** Un
16ac0 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
16ad0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
16ae0 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
16af0 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
16b00 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
16b10 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16b20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
16b30 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
16b40 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
16b50 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
16b60 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72  agerMovepage() r
16b70 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
16b80 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
16b90 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
16ba0 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
16bb0 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
16bc0 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
16bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16be0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
16bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16c00 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
16c10 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
16c20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16c30 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
16c40 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
16c50 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
16c60 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
16c70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
16c80 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
16c90 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
16ca0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
16cb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
16cc0 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
16cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16ce0 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
16cf0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
16d00 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
16d10 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
16d20 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
16d30 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
16d40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
16d50 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
16d60 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
16d70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
16d80 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
16d90 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
16da0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16db0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
16dc0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16dd0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
16de0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
16df0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
16e00 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
16e10 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
16e20 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
16e30 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
16e40 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
16e50 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
16e60 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
16e70 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
16e80 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
16e90 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
16ea0 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
16eb0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
16ec0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
16ed0 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
16ee0 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69  rom free page li
16ef0 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52  st */.  lruListR
16f00 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f  emove(pPg);..  /
16f10 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
16f20 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
16f30 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
16f40 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
16f50 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
16f60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
16f70 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  ed to truncate t
16f80 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20  he cache when a 
16f90 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74  database.** is t
16fa0 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20  runcated.  Drop 
16fb0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61  from the cache a
16fc0 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
16fd0 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72  gno is.** larger
16fe0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
16ff0 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
17000 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  ferenced..**.** 
17010 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
17020 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
17030 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
17040 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63  zeroed..**.** Ac
17050 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70  tually, at the p
17060 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
17070 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
17080 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65  would be.** an e
17090 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72  rror to have a r
170a0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20  eferenced page. 
170b0 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e   But rather than
170c0 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20   delete.** that 
170d0 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74  page and guarant
170e0 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  ee a subsequent 
170f0 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65  segfault, it see
17100 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20  ms better.** to 
17110 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65  zero it and hope
17120 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f   that we error o
17130 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74  ut sanely..*/.st
17140 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
17150 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
17160 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17170 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
17180 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
17190 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
171a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
171b0 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70  pPg = &pPager->p
171c0 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  All;.  while( (p
171d0 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29  Pg = *ppPg)!=0 )
171e0 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  {.    if( pPg->p
171f0 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20  gno<=dbSize ){. 
17200 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
17210 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
17220 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e  }else if( pPg->n
17230 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  Ref>0 ){.      m
17240 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
17250 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
17260 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17270 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
17280 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
17290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
172a0 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  pPg = pPg->pNext
172b0 41 6c 6c 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  All;.#ifdef SQLI
172c0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
172d0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 20 20  _MANAGEMENT.    
172e0 20 20 69 66 28 20 2a 70 70 50 67 20 29 7b 0a 20    if( *ppPg ){. 
172f0 20 20 20 20 20 20 20 28 2a 70 70 50 67 29 2d 3e         (*ppPg)->
17300 70 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 2d 3e  pPrevAll = pPg->
17310 70 50 72 65 76 41 6c 6c 3b 0a 20 20 20 20 20 20  pPrevAll;.      
17320 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 49  }.#endif.      I
17330 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
17340 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
17350 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
17360 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
17370 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
17380 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
17390 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
173a0 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
173b0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
173c0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
173d0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
173e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
173f0 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
17400 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
17410 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17420 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
17430 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
17440 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
17450 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
17460 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
17470 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
17480 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
17490 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
174a0 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
174b0 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
174c0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
174d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
174e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
174f0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
17500 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
17510 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
17520 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
17530 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
17540 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
17550 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
17560 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
17570 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
17580 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
17590 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
175a0 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
175b0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
175c0 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
175d0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
175e0 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
175f0 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
17600 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
17610 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
17620 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
17630 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
17640 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
17650 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
17660 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
17670 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
17680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17690 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
176a0 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
176b0 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
176c0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
176d0 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
176e0 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
176f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
17700 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
17710 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
17720 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  ) pPager->pBusyH
17730 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20 3d 20  andler->nBusy = 
17740 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  0;.    do {.    
17750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17760 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
17770 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
17780 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
17790 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
177a0 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
177b0 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
177c0 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
177d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
177e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
177f0 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
17800 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
17810 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
17820 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
17830 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
17840 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17850 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
17860 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
17870 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17880 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
17890 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
178a0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
178b0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
178c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
178d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
178e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
178f0 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
17900 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17910 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
17920 30 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  0);.  if( pPager
17930 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
17940 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17950 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
17960 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
17970 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
17980 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
17990 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
179a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
179b0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
179c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
179d0 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
179e0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
179f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
17a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17a10 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
17a20 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
17a30 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
17a40 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
17a50 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
17a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17a70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17a80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
17a90 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17aa0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17ab0 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
17ac0 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
17ad0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
17ae0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
17af0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
17b00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
17b10 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
17b20 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
17b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17b50 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
17b60 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
17b70 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
17b80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
17b90 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
17ba0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
17bb0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
17bc0 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
17bd0 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
17be0 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
17bf0 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
17c00 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
17c10 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
17c20 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
17c30 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
17c40 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
17c50 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
17c60 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
17c70 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
17c80 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
17c90 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
17ca0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
17cb0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
17cc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17cd0 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
17ce0 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
17cf0 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
17d00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
17d10 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
17d20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17d30 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
17d40 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
17d50 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
17d60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
17d70 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
17d80 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
17d90 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
17da0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
17db0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
17dc0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
17dd0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
17de0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17df0 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
17e00 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
17e10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17e20 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
17e30 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  T.  if( !MEMDB )
17e40 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
17e50 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20  _MUTEX_NOOP.    
17e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
17e70 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
17e80 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
17e90 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
17ea0 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  2);.#endif.    s
17eb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17ec0 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69  er(mutex);.    i
17ed0 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76  f( pPager->pPrev
17ee0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17ef0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
17f00 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
17f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
17f30 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
17f40 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
17f50 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29   pPager->pNext )
17f60 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17f70 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
17f80 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20  Pager->pPrev;.  
17f90 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
17fa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
17fb0 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  x);.  }.#endif..
17fc0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
17fd0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
17fe0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
17ff0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
18000 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18010 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
18020 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
18030 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
18040 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
18050 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
18060 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
18070 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18080 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
18090 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
180a0 6c 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45 52 54  lloc();.  PAGERT
180b0 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
180c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
180d0 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
180e0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
180f0 50 61 67 65 72 29 29 0a 20 20 69 66 28 20 70 50  Pager)).  if( pP
18100 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18110 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
18120 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
18130 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
18140 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
18150 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
18160 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
18170 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
18180 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
18190 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
181a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
181b0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
181c0 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
181d0 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
181e0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
181f0 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
18200 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18210 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
18220 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
18230 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
18240 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73    ** }.  */..  s
18250 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
18260 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
18270 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
18280 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
18290 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
182a0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
182b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
182c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
182d0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
182e0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
182f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
18300 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
18310 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
18320 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
18330 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
18340 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
18350 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
18360 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18370 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
18380 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
18390 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
183a0 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
183b0 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
183c0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
183d0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
183e0 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
183f0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
18400 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
18410 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
18420 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
18430 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
18440 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
18450 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
18460 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
18470 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
18480 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
18490 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
184a0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
184b0 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
184c0 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
184d0 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
184e0 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
184f0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
18500 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
18510 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
18520 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
18530 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
18540 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
18550 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
18560 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
18570 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76      lruListRemov
18580 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  e(pPg);.    pPg-
18590 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
185a0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
185b0 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ++;.}.#ifdef SQL
185c0 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74  ITE_DEBUG.  stat
185d0 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66  ic void page_ref
185e0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
185f0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
18600 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67  =0 ){.      _pag
18610 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  e_ref(pPg);.    
18620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
18630 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
18640 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
18650 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
18660 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
18670 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
18680 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
18690 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
186a0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
186b0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
186c0 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
186d0 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
186e0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
186f0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
18700 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
18710 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
18720 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
18730 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
18740 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
18750 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d   pagerLeave(pPg-
18760 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  >pPager);.  retu
18770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18780 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
18790 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
187a0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
187b0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
187c0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
187d0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
187e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
187f0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
18800 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
18810 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
18820 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
18830 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
18840 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
18850 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
18860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
18870 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
18880 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
18890 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
188a0 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
188b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
188c0 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
188d0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
188e0 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
188f0 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
18900 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
18910 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
18920 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
18930 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
18940 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
18950 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
18960 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
18970 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
18980 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
18990 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
189a0 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
189b0 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
189c0 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
189d0 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
189e0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
189f0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
18a00 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
18a10 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
18a20 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
18a30 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
18a40 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
18a50 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
18a60 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
18a70 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
18a80 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
18a90 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
18aa0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
18ab0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
18ac0 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
18ad0 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
18ae0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
18af0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
18b00 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
18b10 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
18b20 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
18b30 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
18b40 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
18b50 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
18b60 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
18b70 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
18b80 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
18b90 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
18ba0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
18bb0 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
18bc0 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
18bd0 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
18be0 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
18bf0 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
18c00 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
18c10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18c20 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
18c30 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
18c40 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
18c50 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
18c60 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
18c70 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
18c80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18c90 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
18ca0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18cb0 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
18cc0 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
18cd0 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
18ce0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
18cf0 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
18d00 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
18d10 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
18d20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
18d30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
18d40 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
18d50 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
18d60 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  File ){.      in
18d70 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
18d80 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
18d90 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
18da0 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
18db0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18dc0 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20  lOpen );..      
18dd0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
18de0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
18df0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
18e00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
18e10 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
18e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
18e30 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
18e40 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
18e50 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
18e60 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
18e70 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
18e80 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
18e90 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
18ea0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
18eb0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
18ec0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
18ed0 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
18ee0 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
18ef0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
18f00 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
18f10 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
18f20 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
18f30 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
18f40 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
18f50 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
18f60 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
18f70 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
18f80 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
18f90 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
18fa0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
18fb0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
18fc0 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
18fd0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
18fe0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
18ff0 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
19000 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
19010 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19020 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
19030 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
19040 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
19050 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
19060 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c          i64 jrnl
19070 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Off;.        if(
19080 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
19090 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
190a0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
190b0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
190c0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
190d0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
190e0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
190f0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
19100 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
19110 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
19120 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
19130 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
19140 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
19150 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
19160 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
19170 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
19180 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
19190 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20        jrnlOff = 
191a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
191b0 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
191c0 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
191d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
191e0 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
191f0 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66  , pPager, jrnlOf
19200 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20  f, 4));.        
19210 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
19220 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
19230 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e  nlOff, pPager->n
19240 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
19250 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19270 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
19280 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
19290 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
192a0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
192b0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
192c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
192d0 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  er));.        IO
192e0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
192f0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
19300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19310 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
19320 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
19330 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
19340 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
19350 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
19360 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
19370 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
19380 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
19390 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
193a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
193b0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
193c0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
193d0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
193e0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
193f0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
19400 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
19410 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
19420 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
19430 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
19440 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
19450 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
19460 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
19470 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
19480 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46  .    lruListSetF
19490 69 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65  irstSynced(pPage
194a0 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  r);.  }..#ifndef
194b0 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
194c0 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
194d0 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  nc flag is clear
194e0 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e   then the PgHdr.
194f0 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c  needSync.  ** fl
19500 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ag must also be 
19510 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61  clear for all pa
19520 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  ges.  Verify tha
19530 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61  t this.  ** inva
19540 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20  riant is true.. 
19550 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
19560 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
19570 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
19580 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
19590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
195a0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
195b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
195c0 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  t( pPager->lru.p
195d0 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
195e0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20  ger->lru.pFirst 
195f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
19600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19610 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
19620 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
19630 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
19640 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
19650 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
19660 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
19670 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
19680 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
19690 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
196a0 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
196b0 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
196c0 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
196d0 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
196e0 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
196f0 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
19700 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
19710 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
19720 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
19730 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
19740 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
19750 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
19760 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
19770 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
19780 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
19790 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
197a0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
197b0 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
197c0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
197d0 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
197e0 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
197f0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
19800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
19810 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
19820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
19830 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
19840 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
19850 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
19860 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
19870 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
19880 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
19890 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
198a0 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
198b0 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
198c0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
198d0 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
198e0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
198f0 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23  UCKET_ALLOC 25.#
19900 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
19910 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69  CKET       25.#i
19920 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
19930 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  .  int sqlite3_p
19940 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
19950 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66  et = 0;.  #undef
19960 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20   N_SORT_BUCKET. 
19970 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f   #define N_SORT_
19980 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c  BUCKET \.   (sql
19990 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
199a0 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33  t_bucket?sqlite3
199b0 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
199c0 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b  cket:N_SORT_BUCK
199d0 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66  ET_ALLOC).#endif
199e0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73  .static PgHdr *s
199f0 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ort_pagelist(PgH
19a00 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64  dr *pIn){.  PgHd
19a10 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b  r *a[N_SORT_BUCK
19a20 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20  ET_ALLOC], *p;. 
19a30 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
19a40 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
19a50 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
19a60 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
19a70 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
19a80 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
19a90 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
19aa0 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
19ab0 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
19ac0 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
19ad0 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
19ae0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
19af0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
19b00 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
19b10 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
19b20 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
19b30 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
19b40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
19b50 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
19b60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
19b70 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65  erage: To get he
19b80 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74  re, there need t
19b90 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42  o be 2^(N_SORT_B
19ba0 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a  UCKET) .      **
19bb0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
19bc0 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69   input list. Thi
19bd0 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62  s is possible, b
19be0 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a  ut impractical..
19bf0 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67        ** Testing
19c00 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68   this line is th
19c10 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61  e point of globa
19c20 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  l variable.     
19c30 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65   ** sqlite3_page
19c40 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e  r_n_sort_bucket.
19c50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19c60 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
19c70 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
19c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
19c90 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
19ca0 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
19cb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
19cc0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
19cd0 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
19ce0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
19cf0 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
19d00 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
19d10 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
19d20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
19d30 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
19d40 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
19d50 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
19d60 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
19d70 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
19d80 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
19d90 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
19da0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
19db0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
19dc0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50  ger *pPager;.  P
19dd0 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  gHdr *p;.  int r
19de0 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
19df0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19e00 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
19e10 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
19e20 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
19e30 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
19e40 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
19e50 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
19e60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
19e70 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
19e80 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
19e90 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
19ea0 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
19eb0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
19ec0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
19ed0 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
19ee0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
19ef0 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
19f00 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
19f10 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
19f20 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
19f30 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
19f40 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
19f50 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
19f60 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
19f70 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
19f80 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
19f90 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
19fa0 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
19fb0 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
19fc0 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
19fd0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
19fe0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
19ff0 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
1a000 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
1a010 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
1a020 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
1a030 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
1a040 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
1a050 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
1a060 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
1a070 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
1a080 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1a090 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
1a0a0 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
1a0b0 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
1a0c0 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
1a0d0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
1a0e0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
1a0f0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1a100 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
1a110 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
1a120 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
1a130 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1a140 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
1a150 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
1a160 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
1a170 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
1a180 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
1a190 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1a1a0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1a1b0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
1a1c0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
1a1d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a1e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a1f0 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72  }..  pList = sor
1a200 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74  t_pagelist(pList
1a210 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1a220 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1a230 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a240 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70  ->dirty );.    p
1a250 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  ->dirty = 0;.  }
1a260 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1a270 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ){..    /* If th
1a280 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  e file has not y
1a290 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
1a2a0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a  open it now. */.
1a2b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1a2c0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1a2d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1a2e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1a2f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a300 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
1a310 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
1a320 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
1a330 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
1a340 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1a350 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a360 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
1a370 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
1a380 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
1a390 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1a3a0 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
1a3b0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
1a3c0 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
1a3d0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29  3PagerTruncate()
1a3e0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
1a3f0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
1a400 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
1a410 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
1a420 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
1a430 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
1a440 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
1a450 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
1a460 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
1a470 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
1a480 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
1a490 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
1a4a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
1a4b0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1a4c0 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
1a4d0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
1a4e0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
1a4f0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
1a500 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
1a510 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1a520 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
1a530 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1a540 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a550 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1a560 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
1a570 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1a580 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
1a590 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
1a5a0 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
1a5b0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1a5c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a5d0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1a5e0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
1a5f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a600 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
1a610 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1a620 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
1a630 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
1a640 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1a650 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
1a660 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1a670 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
1a680 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1a690 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
1a6a0 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
1a6b0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1a6c0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
1a6d0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1a6e0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
1a6f0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
1a700 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
1a710 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1a720 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
1a730 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
1a740 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
1a750 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
1a760 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1a770 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
1a780 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1a790 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
1a7a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
1a7b0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1a7c0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1a7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a7e0 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
1a7f0 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
1a800 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
1a810 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
1a820 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
1a830 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
1a840 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
1a850 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
1a860 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
1a870 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
1a880 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
1a890 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1a8a0 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
1a8b0 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64 65 66 20  ager){..#ifndef 
1a8c0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  NDEBUG.  /* Veri
1a8d0 66 79 20 74 68 65 20 73 61 6e 69 74 79 20 6f 66  fy the sanity of
1a8e0 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
1a8f0 77 68 65 6e 20 77 65 20 61 72 65 20 72 75 6e 6e  when we are runn
1a900 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64 65 62 75  ing.  ** in debu
1a910 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 54 68 69  gging mode.  Thi
1a920 73 20 69 73 20 65 78 70 65 6e 73 69 76 65 2c 20  s is expensive, 
1a930 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 64  so do not.  ** d
1a940 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e 6f 72 6d  o this on a norm
1a950 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a 20 20 69  al build. */.  i
1a960 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20 69 6e 74  nt n1 = 0;.  int
1a970 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67 48 64 72   n2 = 0;.  PgHdr
1a980 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61   *p;.  for(p=pPa
1a990 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1a9a0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 20 69 66  p->pNextAll){ if
1a9b0 28 20 70 2d 3e 64 69 72 74 79 20 29 20 6e 31 2b  ( p->dirty ) n1+
1a9c0 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d 70 50 61  +; }.  for(p=pPa
1a9d0 67 65 72 2d 3e 70 44 69 72 74 79 3b 20 70 3b 20  ger->pDirty; p; 
1a9e0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 20 6e 32  p=p->pDirty){ n2
1a9f0 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ++; }.  assert( 
1aa00 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64 69 66  n1==n2 );.#endif
1aa10 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ..  return pPage
1aa20 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
1aa30 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1aa40 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
1aa50 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
1aa60 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
1aa70 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
1aa80 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
1aa90 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
1aaa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
1aab0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
1aac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1aad0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
1aae0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
1aaf0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
1ab00 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
1ab10 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
1ab20 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
1ab30 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
1ab40 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
1ab50 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1ab60 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  al..**.** Return
1ab70 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61   negative if una
1ab80 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
1ab90 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
1aba0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1abb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1abc0 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65  oes not open the
1abd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
1abe0 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20   examine its.** 
1abf0 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c  content.  Hence,
1ac00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1ac10 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ht contain the n
1ac20 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a  ame of a master.
1ac30 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ac40 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65  that has been de
1ac50 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65  leted, and hence
1ac60 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72   not be hot.  Or
1ac70 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f  .** the header o
1ac80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  f the journal mi
1ac90 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75  ght be zeroed ou
1aca0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1acb0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73  .** does not dis
1acc0 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65  cover these case
1acd0 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a  s of a non-hot j
1ace0 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a  ournal - if the.
1acf0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ad00 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
1ad10 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75  t empty this rou
1ad20 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a  tine assumes it.
1ad30 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20  ** is hot.  The 
1ad40 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
1ad50 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
1ad60 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a  scover that the.
1ad70 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ad80 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
1ad90 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70  t and will no-op
1ada0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1adb0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
1adc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1add0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1ade0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1adf0 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  ;.  int res = 0;
1ae00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75  .  if( pPager->u
1ae10 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 70 50 61  seJournal && pPa
1ae20 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1ae30 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  s ){.    int rc;
1ae40 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
1ae50 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
1ae60 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
1ae70 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1ae80 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1ae90 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1aea0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
1aeb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1aec0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
1aed0 74 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ts ){.      rc =
1aee0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
1aef0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
1af00 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
1af10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1af20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1af30 26 20 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63  & exists && !loc
1af40 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ked ){.      int
1af50 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 63   nPage;.      rc
1af60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1af70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
1af80 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1af90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1afa0 4b 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b  K && nPage==0 ){
1afb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1afc0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
1afd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1afe0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69   0);.        exi
1aff0 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  sts = 0;.      }
1b000 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 73 20  .    }..    res 
1b010 3d 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  = (rc!=SQLITE_OK
1b020 20 3f 20 2d 31 20 3a 20 28 65 78 69 73 74 73 20   ? -1 : (exists 
1b030 26 26 20 21 6c 6f 63 6b 65 64 29 29 3b 0a 20 20  && !locked));.  
1b040 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  }..  return res;
1b050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1b060 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
1b070 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
1b080 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
1b090 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1b0a0 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
1b0b0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
1b0c0 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
1b0d0 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
1b0e0 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
1b0f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
1b100 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1b110 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
1b120 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
1b130 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
1b140 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1b150 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20  .  *ppPg = 0;.. 
1b160 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61   /* It is illega
1b170 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  l to call this f
1b180 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74  unction unless t
1b190 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a  he pager object.
1b1a0 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
1b1b0 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61 74  by pPager has at
1b1c0 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20   least one free 
1b1d0 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68 20  page (page with 
1b1e0 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a  nRef==0)..  */ .
1b1f0 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
1b200 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
1b210 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1b220 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
1b230 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
1b240 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
1b250 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
1b260 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
1b270 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
1b280 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
1b290 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
1b2a0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1b2b0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
1b2c0 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
1b2d0 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
1b2e0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1b2f0 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
1b300 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
1b310 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
1b320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b330 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
1b340 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
1b350 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
1b360 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
1b370 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
1b380 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
1b390 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
1b3a0 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
1b3b0 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  & pPager->lru.pF
1b3c0 69 72 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  irst ){.    if( 
1b3d0 21 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  !pPager->errCode
1b3e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1b3f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1b400 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1b410 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1b420 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
1b430 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1b440 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1b450 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1b460 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b470 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  }.      if( pPag
1b480 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1b490 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1b4a0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1b4b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1b4c0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
1b4d0 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
1b4e0 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
1b4f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
1b500 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1b510 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
1b520 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
1b530 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
1b540 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 61  l.        ** hea
1b550 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
1b560 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
1b570 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
1b580 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 20 20  at have.        
1b590 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
1b5a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1b5b0 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
1b5c0 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
1b5d0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65         ** trashe
1b5e0 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20  d when the nRec 
1b5f0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
1b600 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
1b610 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1b620 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
1b630 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b640 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29  journalOff > 0 )
1b650 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b660 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1b670 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
1b680 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1b690 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1b6a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b6b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1b6c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b6d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b6e0 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67  }.    pPg = pPag
1b6f0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
1b700 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1b710 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
1b720 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
1b730 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
1b740 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
1b750 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
1b760 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
1b770 26 20 21 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  & !pPager->errCo
1b780 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
1b790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1b7a0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
1b7b0 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
1b7c0 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64  pPg);.    pPg->d
1b7d0 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  irty = 1;.    pP
1b7e0 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
1b7f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1b800 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
1b810 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  g );.    pPg->di
1b820 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1b830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b840 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1b850 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
1b860 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
1b870 79 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  y==0 || pPager->
1b880 65 72 72 43 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  errCode );..  /*
1b890 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
1b8a0 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
1b8b0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
1b8c0 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
1b8d0 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
1b8e0 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
1b8f0 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
1b900 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a  sabling the.  **
1b910 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1b920 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  tRollback() opti
1b930 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
1b940 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
1b950 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
1b960 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
1b970 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
1b980 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
1b990 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
1b9a0 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  k.  ** might be 
1b9b0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
1b9c0 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
1b9d0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
1b9e0 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  n't remember.  *
1b9f0 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
1ba00 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
1ba10 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
1ba20 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
1ba30 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72  must.  ** be mar
1ba40 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
1ba50 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
1ba60 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  on out..  */.  i
1ba70 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1ba80 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f  llback ){.    IO
1ba90 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52  TRACE(("ALWAYS_R
1baa0 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70  OLLBACK %p\n", p
1bab0 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67  Pager)).    pPag
1bac0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1bad0 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 1;.  }..  /
1bae0 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
1baf0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
1bb00 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
1bb10 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f   hash table.  */
1bb20 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50  .  unlinkPage(pP
1bb30 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g);.  assert( pP
1bb40 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20  g->pgno==0 );.. 
1bb50 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20   *ppPg = pPg;.  
1bb60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bb70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1bb80 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1bb90 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a  _MANAGEMENT./*.*
1bba0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1bbb0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65  is called to fre
1bbc0 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79  e superfluous dy
1bbd0 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
1bbe0 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65  ted memory.** he
1bbf0 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ld by the pager 
1bc00 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69  system. Memory i
1bc10 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c  n use by any SQL
1bc20 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61  ite pager alloca
1bc30 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  ted.** by the cu
1bc40 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79  rrent thread may
1bc50 20 62 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65   be sqlite3_free
1bc60 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71  ()ed..**.** nReq
1bc70 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1bc80 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
1bc90 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65  y required. Once
1bca0 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a   this much has.*
1bcb0 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c  * been released,
1bcc0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   the function re
1bcd0 74 75 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72  turns. The retur
1bce0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74  n value is the t
1bcf0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20  otal number .** 
1bd00 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
1bd10 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a  ry released..*/.
1bd20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1bd30 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e  ReleaseMemory(in
1bd40 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e  t nReq){.  int n
1bd50 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20  Released = 0;   
1bd60 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1bd70 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
1bd80 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50  ed so far */.  P
1bd90 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
1bda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1bdb0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
1bdc0 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79 48  agers */.  BusyH
1bdd0 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75 73  andler *savedBus
1bde0 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  y;     /* Saved 
1bdf0 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73 79  copy of the busy
1be00 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e   handler */.  in
1be10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1be20 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  ;..  /* Acquire 
1be30 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67  the memory-manag
1be40 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f  ement mutex.  */
1be50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1be60 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 73 71 6c  MUTEX_NOOP.  sql
1be70 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1be80 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
1be90 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20  MEM2 mutex */.  
1bea0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
1beb0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1bec0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
1bed0 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  M2);.#endif.  sq
1bee0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1bef0 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  r(mutex);..  /* 
1bf00 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62  Signal all datab
1bf10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1bf20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61  that memory mana
1bf30 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a  gement wants.  *
1bf40 2a 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73  * to have access
1bf50 20 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a   to the pagers..
1bf60 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65    */.  for(pPage
1bf70 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  r=sqlite3PagerLi
1bf80 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67  st; pPager; pPag
1bf90 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  er=pPager->pNext
1bfa0 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ){.     pPager->
1bfb0 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20  iInUseMM = 1;.  
1bfc0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
1bfd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52  SQLITE_OK && (nR
1bfe0 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
1bff0 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50  d<nReq) ){.    P
1c000 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50  gHdr *pPg;.    P
1c010 67 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b  gHdr *pRecycled;
1c020 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  . .    /* Try to
1c030 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   find a page to 
1c040 72 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65  recycle that doe
1c050 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  s not require a 
1c060 73 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a  sync(). If.    *
1c070 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f  * this is not po
1c080 73 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65  ssible, find one
1c090 20 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69   that does requi
1c0a0 72 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20  re a sync()..   
1c0b0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1c0c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1c0d0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1c0e0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1c0f0 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67  C_LRU));.    pPg
1c100 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1c110 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63  eList.pFirstSync
1c120 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ed;.    while( p
1c130 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64  Pg && (pPg->need
1c140 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61  Sync || pPg->pPa
1c150 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29  ger->iInUseDB) )
1c160 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  {.      pPg = pP
1c170 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a  g->gfree.pNext;.
1c180 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
1c190 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20  Pg ){.      pPg 
1c1a0 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  = sqlite3LruPage
1c1b0 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20  List.pFirst;.   
1c1c0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
1c1d0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49   pPg->pPager->iI
1c1e0 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20  nUseDB ){.      
1c1f0 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72    pPg = pPg->gfr
1c200 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  ee.pNext;.      
1c210 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1c220 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c230 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1c240 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1c250 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20  TATIC_LRU));..  
1c260 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20    /* If pPg==0, 
1c270 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  then the block a
1c280 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20  bove has failed 
1c290 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  to find a page t
1c2a0 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65  o.    ** recycle
1c2b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
1c2c0 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f  eturn early - no
1c2d0 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20   further memory 
1c2e0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
1c2f0 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  eleased..    */.
1c300 20 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62      if( !pPg ) b
1c310 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65  reak;..    pPage
1c320 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c330 0a 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67  .    assert(!pPg
1c340 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1c350 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1c360 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65  First);.    asse
1c370 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  rt(pPg->needSync
1c380 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d   || pPg==pPager-
1c390 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1c3a0 64 29 3b 0a 20 20 0a 20 20 20 20 73 61 76 65 64  d);.  .    saved
1c3b0 42 75 73 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  Busy = pPager->p
1c3c0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
1c3d0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
1c3e0 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  ndler = 0;.    r
1c3f0 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c  c = pager_recycl
1c400 65 28 70 50 61 67 65 72 2c 20 26 70 52 65 63 79  e(pPager, &pRecy
1c410 63 6c 65 64 29 3b 0a 20 20 20 20 70 50 61 67 65  cled);.    pPage
1c420 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
1c430 3d 20 73 61 76 65 64 42 75 73 79 3b 0a 20 20 20  = savedBusy;.   
1c440 20 61 73 73 65 72 74 28 70 52 65 63 79 63 6c 65   assert(pRecycle
1c450 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53 51  d==pPg || rc!=SQ
1c460 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66  LITE_OK);.    if
1c470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c480 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 27 76  ){.      /* We'v
1c490 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
1c4a0 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
1c4b0 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
1c4c0 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a  as been .      *
1c4d0 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
1c4e0 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
1c4f0 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
1c500 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
1c510 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53       ** (pFirstS
1c520 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74  ynced). It is st
1c530 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70  ill in the all p
1c540 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74  ages (pAll) list
1c550 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  . .      ** Remo
1c560 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
1c570 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
1c580 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ing..      **.  
1c590 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
1c5a0 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
1c5b0 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
1c5c0 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
1c5d0 20 49 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 72   It .      ** pr
1c5e0 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
1c5f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1c600 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
1c610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
1c620 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
1c630 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ==pPager->pAll )
1c640 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72  {.         asser
1c650 74 28 70 50 67 2d 3e 70 50 72 65 76 41 6c 6c 3d  t(pPg->pPrevAll=
1c660 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 61 73  =0);.         as
1c670 73 65 72 74 28 70 50 67 2d 3e 70 4e 65 78 74 41  sert(pPg->pNextA
1c680 6c 6c 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 4e  ll==0 || pPg->pN
1c690 65 78 74 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c  extAll->pPrevAll
1c6a0 3d 3d 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  ==pPg);.        
1c6b0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1c6c0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
1c6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1c6e0 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
1c6f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1c700 41 6c 6c 2d 3e 70 50 72 65 76 41 6c 6c 20 3d 20  All->pPrevAll = 
1c710 30 3b 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20  0;.         }.  
1c720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c730 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e      assert(pPg->
1c740 70 50 72 65 76 41 6c 6c 29 3b 0a 20 20 20 20 20  pPrevAll);.     
1c750 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e      assert(pPg->
1c760 70 50 72 65 76 41 6c 6c 2d 3e 70 4e 65 78 74 41  pPrevAll->pNextA
1c770 6c 6c 3d 3d 70 50 67 29 3b 0a 20 20 20 20 20 20  ll==pPg);.      
1c780 20 20 20 70 54 6d 70 20 3d 20 70 50 67 2d 3e 70     pTmp = pPg->p
1c790 50 72 65 76 41 6c 6c 3b 0a 20 20 20 20 20 20 20  PrevAll;.       
1c7a0 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c    pTmp->pNextAll
1c7b0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
1c7c0 3b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 70  ;.         if( p
1c7d0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  Tmp->pNextAll ){
1c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6d 70  .           pTmp
1c7f0 2d 3e 70 4e 65 78 74 41 6c 6c 2d 3e 70 50 72 65  ->pNextAll->pPre
1c800 76 41 6c 6c 20 3d 20 70 54 6d 70 3b 0a 20 20 20  vAll = pTmp;.   
1c810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c820 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1c830 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1c840 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1c850 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1c860 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1c870 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1c880 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1c890 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1c8a0 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1c8b0 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1c8c0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1c8d0 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1c8e0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1c8f0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1c900 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1c910 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1c920 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
1c930 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pPg->pData);. 
1c940 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1c950 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
1c960 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
1c970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c980 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
1c990 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
1c9a0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1c9b0 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
1c9c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
1c9d0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
1c9e0 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
1c9f0 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
1ca00 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  e .      ** call
1ca10 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
1ca20 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65  ion. Instead, se
1ca30 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43  t the Pager.errC
1ca40 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  ode variable..  
1ca50 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72      ** The error
1ca60 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1ca70 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f  d to the user (o
1ca80 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20  r users, in the 
1ca90 63 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  case .      ** o
1caa0 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72  f a shared pager
1cab0 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70   cache) of the p
1cac0 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  ager for which t
1cad0 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  he error occured
1cae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1caf0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
1cb00 20 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51     (rc&0xff)==SQ
1cb10 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
1cb20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1cb30 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
1cb40 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1cb50 42 55 53 59 0a 20 20 20 20 20 20 29 3b 0a 20 20  BUSY.      );.  
1cb60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cb70 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1cb80 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
1cb90 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
1cba0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1cbb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
1cbc0 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e  r the memory man
1cbd0 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e  agement flags an
1cbe0 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  d release the mu
1cbf0 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  tex.  */.  for(p
1cc00 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
1cc10 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
1cc20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
1cc30 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
1cc40 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
1cc50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1cc60 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
1cc70 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  x);..  /* Return
1cc80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1cc90 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20  ytes released.  
1cca0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  */.  return nRel
1ccb0 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
1ccc0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1ccd0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1cce0 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  NT */../*.** Rea
1ccf0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
1cd00 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
1cd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cd20 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1cd30 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67  t readDbPage(Pag
1cd40 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
1cd50 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  r *pPg, Pgno pgn
1cd60 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
1cd70 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73  i64 offset;.  as
1cd80 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
1cd90 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
1cda0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
1cdb0 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
1cdc0 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
1cdd0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1cde0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1cdf0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1ce00 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66  _READ;.  }.  off
1ce10 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1ce20 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1ce30 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1ce40 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1ce50 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
1ce60 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
1ce70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1ce80 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  set);.  PAGER_IN
1ce90 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1cea0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
1ceb0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1cec0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
1ced0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
1cee0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1cef0 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67  pgno));.  if( pg
1cf00 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d  no==1 ){.    mem
1cf10 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1cf20 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
1cf30 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1cf40 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20  g))[24],.       
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
1cf80 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cf90 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
1cfa0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
1cfb0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
1cfc0 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41  ->pgno, 3);.  PA
1cfd0 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48  GERTRACE4("FETCH
1cfe0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1cff0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1d000 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1d010 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1d020 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1d030 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65  hash(pPg));.  re
1d040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1d050 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d060 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
1d070 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
1d080 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
1d090 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
1d0a0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
1d0b0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
1d0c0 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
1d0d0 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
1d0e0 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
1d0f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d100 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1d110 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
1d120 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  r obtaining the 
1d130 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20  shared lock (if 
1d140 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20  required), this 
1d150 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63  function.** chec
1d160 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ks for a hot-jou
1d170 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e  rnal file. If on
1d180 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65  e is found, an e
1d190 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
1d1a0 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65  k.** is performe
1d1b0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a  d immediately..*
1d1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1d1d0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
1d1e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1d1f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d200 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f 74 20 3d  K;.  int isHot =
1d210 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
1d220 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  s database is op
1d230 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69  ened for exclusi
1d240 76 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e  ve access, has n
1d250 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
1d260 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e   ** page referen
1d270 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e  ces and is in an
1d280 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f   error-state, no
1d290 77 20 69 73 20 74 68 65 20 63 68 61 6e 63 65 20  w is the chance 
1d2a0 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68  to clear.  ** th
1d2b0 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64  e error. Discard
1d2c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1d2d0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
1d2e0 20 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20   and treat any. 
1d2f0 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   ** open journal
1d300 20 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a   file as a hot-j
1d310 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ournal..  */.  i
1d320 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
1d330 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1d340 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  de && pPager->nR
1d350 65 66 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ef==0 && pPager-
1d360 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1d370 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1d380 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
1d390 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20   isHot = 1;.    
1d3a0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
1d3b0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
1d3c0 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  K;.    pager_res
1d3d0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1d3e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
1d3f0 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61  er is still in a
1d400 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
1d410 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54  o not proceed. T
1d420 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73  he error .  ** s
1d430 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65  tate will be cle
1d440 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69  ared at some poi
1d450 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1d460 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a   when all page .
1d470 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
1d480 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20  are dropped and 
1d490 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65  the cache can be
1d4a0 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f   discarded..  */
1d4b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1d4c0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1d4d0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1d4e0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
1d4f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1d500 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Code;.  }..  if(
1d510 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1d520 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
1d530 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c  isHot ){.    sql
1d540 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1d550 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1d560 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
1d570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d580 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
1d590 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1d5a0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1d5b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d5c0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1d5d0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
1d5e0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
1d5f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d620 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1d630 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  OCK );.         
1d640 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d650 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d680 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
1d690 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
1d6a0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
1d6b0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
1d6c0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
1d6d0 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
1d6e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
1d6f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d700 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
1d710 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
1d720 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
1d730 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
1d740 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
1d750 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
1d760 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30  ;.      if( rc<0
1d770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d780 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d790 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
1d7a0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1d7b0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1d7c0 31 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20  1 || isHot ){.  
1d7d0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1d7e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1d7f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d800 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1d810 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1d820 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1d830 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1d840 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1d850 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1d860 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d870 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1d880 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1d890 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1d8a0 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1d8b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d8c0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1d8d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1d8e0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1d8f0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d900 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1d910 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1d920 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1d930 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1d940 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1d950 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1d960 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1d970 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1d980 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1d990 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1d9a0 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1d9b0 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1d9c0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1d9d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1d9e0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1d9f0 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1da00 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
1da10 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1da20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1da30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1da40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1da50 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
1da60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1da70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1da80 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1da90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1daa0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1dab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dac0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1dad0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1dae0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1daf0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1db00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1db10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1db20 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1db30 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20  LUSIVE;.        
1db40 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  }. .        /* O
1db50 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1db60 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
1db70 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
1db80 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
1db90 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
1dba0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1dbb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1dbc0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
1dbd0 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
1dbe0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
1dbf0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
1dc00 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
1dc10 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
1dc20 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
1dc30 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
1dc40 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
1dc50 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
1dc60 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
1dc70 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
1dc80 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
1dc90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1dca0 20 69 66 28 20 21 69 73 48 6f 74 20 26 26 20 70   if( !isHot && p
1dcb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1dcc0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
1dcd0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
1dce0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dcf0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1dd00 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1dd10 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  ,SQLITE_ACCESS_E
1dd20 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20  XISTS,&res);.   
1dd30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1dd40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dd50 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
1dd60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1dd70 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
1dd90 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
1dda0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1ddb0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1ddc0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
1ddd0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1dde0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
1de00 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1de10 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1de20 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1de30 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
1de40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1de50 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1de60 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1de70 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
1de80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1de90 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  f( fout&SQLITE_O
1dea0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ded0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1dee0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
1def0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1df10 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1df20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1df30 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1df40 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
1df50 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d  , that means som
1df60 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1df80 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c   has already rol
1df90 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20  led it back */. 
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
1dfb0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1dfc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1dfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dfe0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1dff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e010 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
1e020 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1e030 52 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20  RR_UNLOCK .     
1e040 20 20 20 20 20 20 26 26 20 72 63 21 3d 53 51 4c        && rc!=SQL
1e050 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
1e060 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
1e070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1e080 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1e090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e0a0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1e0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e0c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1e0d0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
1e0e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1e0f0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1e100 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1e110 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1e120 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
1e130 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
1e140 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1e150 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
1e160 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
1e170 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
1e180 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
1e190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
1e1a0 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
1e1b0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
1e1c0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
1e1d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e1e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1e1f0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1e200 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1e210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e220 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e230 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1e240 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1e250 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
1e260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e270 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1e280 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
1e290 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20  ARED || .       
1e2a0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78       (pPager->ex
1e2b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
1e2c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47  Pager->state>PAG
1e2d0 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
1e2e0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
1e2f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1e300 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  >pAll ){.       
1e310 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
1e320 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
1e330 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
1e340 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1e350 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74          ** and t
1e360 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
1e370 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e380 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
1e390 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ious.        ** 
1e3a0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1e3b0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
1e3c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1e3d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1e3e0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
1e3f0 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
1e400 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
1e410 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
1e420 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65          ** cache
1e430 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1e440 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
1e450 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
1e460 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
1e470 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
1e480 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nning.        **
1e490 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
1e4a0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
1e4b0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
1e4c0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
1e4d0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d          ** a 32-
1e4e0 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
1e4f0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
1e500 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
1e510 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
1e520 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
1e530 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
1e540 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
1e550 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20  nge when.       
1e560 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
1e570 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a  n use..        *
1e580 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  * .        ** Th
1e590 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
1e5a0 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
1e5b0 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
1e5c0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
1e5d0 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
1e5e0 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
1e5f0 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
1e600 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
1e610 6c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  l that.        *
1e620 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
1e630 65 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  ected..        *
1e640 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64  /.        char d
1e650 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
1e660 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e670 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73  ers)];.        s
1e680 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1e690 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
1e6a0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
1e6b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1e6c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e6d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1e6e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1e6f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
1e700 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1e710 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
1e720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
1e730 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
1e740 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1e750 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1e760 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
1e770 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1e780 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
1e790 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1e7a0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
1e7b0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
1e7c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e7d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e7e0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1e7f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e810 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
1e820 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
1e830 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1e840 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e850 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
1e860 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1e870 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1e880 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
1e890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
1e8a0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1e8b0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1e8c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e8d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e8e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1e8f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
1e900 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1e910 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e920 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1e930 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
1e940 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1e950 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
1e960 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
1e970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e980 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
1e990 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
1e9a0 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
1e9b0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
1e9c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e9d0 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
1e9e0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1e9f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ea00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1ea10 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63  te a PgHdr objec
1ea20 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61  t.   Either crea
1ea30 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20  te a new one or 
1ea40 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73  reuse.** an exis
1ea50 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73  ting one that is
1ea60 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69   not otherwise i
1ea70 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  n use..**.** A n
1ea80 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75  ew PgHdr structu
1ea90 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66  re is created if
1eaa0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
1eab0 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75  owing are.** tru
1eac0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
1ead0 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78    We have not ex
1eae0 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d  ceeded our maxim
1eaf0 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63  um allocated cac
1eb00 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
1eb10 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68      as set by th
1eb20 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  e "PRAGMA cache_
1eb30 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  size" command..*
1eb40 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
1eb50 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65  ere are no unuse
1eb60 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  d PgHdr objects 
1eb70 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69  available at thi
1eb80 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s time..**.**   
1eb90 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61    (3)  This is a
1eba0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1ebb0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
1ebc0 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (4)  There are n
1ebd0 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  o PgHdr objects 
1ebe0 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1ebf0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ire a journal.**
1ec00 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73            file s
1ec10 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f  ync and a sync o
1ec20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1ec30 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  le is currently.
1ec40 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68  **          proh
1ec50 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ibited..**.** Ot
1ec60 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61  herwise, reuse a
1ec70 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  n existing PgHdr
1ec80 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1ec90 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65  s, reuse an.** e
1eca0 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66  xisting PgHdr if
1ecb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1ecc0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1ecd0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1ece0 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f  e have reached o
1ecf0 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d  r exceeded the m
1ed00 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a  aximum cache siz
1ed10 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  e.**          al
1ed20 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41  lowed by "PRAGMA
1ed30 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a   cache_size"..**
1ed40 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
1ed50 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76  re is a PgHdr av
1ed60 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48  ailable with PgH
1ed70 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a  dr->nRef==0.**.*
1ed80 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72  *     (3)  We ar
1ed90 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d  e not in an in-m
1eda0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a  emory database.*
1edb0 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69  *.**     (4)  Ei
1edc0 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ther there is an
1edd0 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72   available PgHdr
1ede0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
1edf0 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eed.**          
1ee00 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20  to be synced to 
1ee10 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73  disk or else dis
1ee20 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72  k syncing is cur
1ee30 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1ee40 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73     allowed..*/.s
1ee50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1ee60 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65  llocatePage(Page
1ee70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1ee80 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20   **ppPg){.  int 
1ee90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1eea0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1eeb0 69 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20  int nByteHdr;.. 
1eec0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
1eed0 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66   PgHdr if any of
1eee0 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74   the four condit
1eef0 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20  ions defined .  
1ef00 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74  ** above are met
1ef10 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  : */.  if( pPage
1ef20 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
1ef30 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50  >mxPage.   || pP
1ef40 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1ef50 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42  ==0 .   || MEMDB
1ef60 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  .   || (pPager->
1ef70 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1ef80 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64  ==0 && pPager->d
1ef90 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20  oNotSync).  ){. 
1efa0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
1efb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1efc0 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
1efd0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61  Hash ){.      pa
1efe0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
1eff0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
1f000 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1f010 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
1f020 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
1f030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1f040 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
1f050 0a 20 20 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 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1f080 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1f090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1f0a0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1f0b0 29 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20  );.    nByteHdr 
1f0c0 3d 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  = sizeof(*pPg) +
1f0d0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1f0e0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
1f100 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
1f110 74 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d  tory);.    pPg =
1f120 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
1f130 6e 42 79 74 65 48 64 72 20 29 3b 0a 20 20 20 20  nByteHdr );.    
1f140 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
1f150 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33   pData = sqlite3
1f160 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  PageMalloc( pPag
1f170 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1f180 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
1f190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1f1a0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
1f1b0 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 30  .        pPg = 0
1f1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f1d0 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70      pagerEnter(p
1f1e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1f1f0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
1f200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1f210 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  M;.      goto pa
1f220 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1f230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
1f240 65 74 28 70 50 67 2c 20 30 2c 20 6e 42 79 74 65  et(pPg, 0, nByte
1f250 48 64 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Hdr);.    pPg->p
1f260 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
1f270 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
1f280 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
1f290 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
1f2a0 65 72 2d 3e 70 41 6c 6c 3b 0a 23 69 66 64 65 66  er->pAll;.#ifdef
1f2b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
1f2c0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
1f2d0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
1f2e0 65 78 74 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  extAll ){.      
1f2f0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 2d 3e 70  pPg->pNextAll->p
1f300 50 72 65 76 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  PrevAll = pPg;. 
1f310 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f320 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
1f330 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  Pg;.    pPager->
1f340 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65  nPage++;.  }else
1f350 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65  {.    /* Recycle
1f360 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   an existing pag
1f370 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65  e with a zero re
1f380 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20  f-count. */.    
1f390 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
1f3a0 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  le(pPager, &pPg)
1f3b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f3c0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
1f3d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1f3e0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20  OERR_BLOCKED;.  
1f3f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1f400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f410 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1f420 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1f430 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1f440 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
1f450 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
1f460 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d  assert(pPg);.  }
1f470 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
1f480 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f  .pager_allocate_
1f490 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  out:.  return rc
1f4a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1f4b0 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65  sure we have the
1f4c0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70   content for a p
1f4d0 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
1f4e0 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  e was.** previou
1f4f0 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1f500 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1f510 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1f520 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69   was.** just ini
1f530 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1f540 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69  s instead of bei
1f550 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ng read from dis
1f560 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65  k..** But now we
1f570 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64   need the real d
1f580 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e  ata off of disk.
1f590 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77    So make sure w
1f5a0 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52  e.** have it.  R
1f5b0 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20  ead it in if we 
1f5c0 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61  do not have it a
1f5d0 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69  lready..*/.stati
1f5e0 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f  c int pager_get_
1f5f0 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70  content(PgHdr *p
1f600 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1f610 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20  needRead ){.    
1f620 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50  int rc = readDbP
1f630 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c  age(pPg->pPager,
1f640 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29   pPg, pPg->pgno)
1f650 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f670 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1f680 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1f690 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f6a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f6b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f6c0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
1f6d0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
1f6e0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
1f6f0 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
1f700 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
1f710 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
1f720 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
1f730 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
1f740 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
1f750 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
1f760 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sed..**.** This 
1f770 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
1f780 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
1f790 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
1f7a0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1f7b0 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
1f7c0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
1f7d0 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
1f7e0 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
1f7f0 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
1f800 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
1f810 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
1f820 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
1f830 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
1f840 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
1f850 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
1f860 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
1f870 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
1f880 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
1f890 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
1f8a0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
1f8b0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
1f8c0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
1f8d0 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
1f8e0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
1f8f0 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
1f900 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
1f910 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1f920 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
1f930 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
1f940 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1f950 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f960 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
1f970 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
1f980 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
1f990 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
1f9a0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1f9b0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
1f9c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1f9d0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
1f9e0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
1f9f0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
1fa00 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
1fa10 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
1fa20 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
1fa30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1fa40 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
1fa50 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
1fa60 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
1fa70 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
1fa80 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
1fa90 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
1faa0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
1fab0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
1fac0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
1fad0 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
1fae0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
1faf0 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
1fb00 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1fb10 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1fb20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
1fb30 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1fb40 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
1fb50 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e  om disk..** If n
1fb60 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
1fb70 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1fb80 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
1fb90 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
1fba0 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
1fbb0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73   at this time, s
1fbc0 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69  o do not do a di
1fbd0 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66  sk read.  Just f
1fbe0 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  ill in the.** pa
1fbf0 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  ge content with 
1fc00 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b  zeros.  But mark
1fc10 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77   the fact that w
1fc20 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20  e have not read 
1fc30 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62  the.** content b
1fc40 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  y setting the Pg
1fc50 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
1fc60 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66  g.  Later on, if
1fc70 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
1fc80 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1fc90 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ed on this page 
1fca0 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
1fcb0 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  ne is.** called 
1fcc0 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e  again with noCon
1fcd0 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tent==0, that me
1fce0 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ans that the con
1fcf0 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a  tent is needed.*
1fd00 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72  * and the disk r
1fd10 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
1fd20 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
1fd30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1fd40 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
1fd50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1fd60 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
1fd70 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
1fd80 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1fd90 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
1fda0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1fdb0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
1fdc0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
1fdd0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
1fde0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
1fdf0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
1fe00 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
1fe10 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
1fe20 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
1fe30 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
1fe40 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
1fe50 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1fe60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1fe70 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1fe80 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  _UNLOCK || pPage
1fe90 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
1fea0 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  o==1 );..  /* Th
1feb0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
1fec0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
1fed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fee0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
1fef0 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
1ff00 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
1ff10 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
1ff20 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
1ff30 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
1ff40 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
1ff50 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
1ff60 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1ff70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ff80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ff90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1ffa0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
1ffb0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
1ffc0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
1ffd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ffe0 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
1fff0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
20000 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
20010 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
20020 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
20030 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
20040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20050 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
20060 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
20070 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
20080 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
20090 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
200a0 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
200b0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
200c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
200d0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
200e0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
200f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
20100 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
20110 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
20120 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
20130 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
20140 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
20150 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
20160 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
20170 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
20180 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69   int nMax;.    i
20190 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f  nt h;.    PAGER_
201a0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
201b0 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ss);.    rc = pa
201c0 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28  gerAllocatePage(
201d0 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20  pPager, &pPg);. 
201e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
201f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
20210 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
20220 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
20230 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f  ( !MEMDB || pgno
20240 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  >pPager->stmtSiz
20250 65 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  e );.    pPg->in
20260 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
20270 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
20280 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
20290 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pgno);.    pPg->
202a0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
202b0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
202c0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  );.    pPg->nRef
202d0 20 3d 20 31 3b 0a 0a 20 20 20 20 70 50 61 67 65   = 1;..    pPage
202e0 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69  r->nRef++;.    i
202f0 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
20300 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
20310 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
20320 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
20330 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
20340 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ra);.    }.    r
20350 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20360 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20370 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66  , &nMax);.    if
20380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
203a0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
203b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
203c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
203d0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
203e0 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
203f0 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
20400 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20410 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
20420 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
20430 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
20440 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
20450 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67  if( nMax<(int)pg
20460 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28  no || MEMDB || (
20470 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
20480 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
20490 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69  back) ){.      i
204a0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
204b0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
204c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
204d0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
204e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
204f0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  FULL;.      }.  
20500 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
20510 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
20520 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20530 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ze);.      pPg->
20540 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e  needRead = noCon
20550 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  tent && !pPager-
20560 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b  >alwaysRollback;
20570 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
20580 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
20590 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
205a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
205b0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
205c0 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67  (pPager, pPg, pg
205d0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
205e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
205f0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
20600 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
20610 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
20620 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
20630 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20640 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
20650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20660 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
20670 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Read = 0;.    }.
20680 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  .    /* Link the
20690 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
206a0 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  age hash table *
206b0 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26  /.    h = pgno &
206c0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
206d0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
206e0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70  pgno!=0 );.    p
206f0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
20700 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20710 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
20720 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
20730 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
20740 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
20750 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
20760 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
20770 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
20780 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
20790 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
207a0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
207b0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
207c0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
207d0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
207e0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
207f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
20800 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
20810 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
20820 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73  cache. */.    as
20830 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65  sert(pPager->nRe
20840 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b  f>0 || pgno==1);
20850 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
20860 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
20870 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e     if( !noConten
20880 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
20890 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
208a0 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  t(pPg);.      if
208b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
208c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
208d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
208e0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
208f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
20900 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20910 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
20920 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
20930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
20940 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
20950 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
20960 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20970 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
20980 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
20990 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
209a0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
209b0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
209c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
209d0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
209e0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
209f0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
20a00 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
20a10 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
20a20 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
20a30 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
20a40 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
20a50 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
20a60 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
20a70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
20a80 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
20a90 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
20aa0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
20ab0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
20ac0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
20ad0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
20ae0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
20af0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
20b00 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
20b10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20b20 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
20b30 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
20b40 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
20b50 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
20b60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
20b70 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
20b80 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
20b90 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
20ba0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
20bb0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
20bc0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
20bd0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
20be0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
20bf0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
20c00 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
20c10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
20c20 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
20c30 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
20c40 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
20c50 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
20c60 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
20c70 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
20c80 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
20c90 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
20ca0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
20cb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
20cc0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
20cd0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
20ce0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
20cf0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
20d00 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
20d10 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
20d20 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
20d30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
20d40 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d  >pAll || pPager-
20d50 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
20d60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
20d70 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
20d80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20d90 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
20da0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  .    /* Do nothi
20db0 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ng */.  }else if
20dc0 28 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  ( (pPg = pager_l
20dd0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
20de0 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  no))!=0 ){.    p
20df0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
20e00 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
20e10 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
20e20 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
20e30 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
20e40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
20e50 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20e60 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
20e70 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
20e80 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
20e90 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
20ea0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
20eb0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
20ec0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
20ed0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
20ee0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
20ef0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
20f00 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
20f10 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
20f20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20f30 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
20f40 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 0a  Pager *pPager;..
20f50 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
20f60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20f70 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
20f80 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 44  >pPager;..  /* D
20f90 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
20fa0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
20fb0 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
20fc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
20fd0 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67 65 72  Ref>0 );.  pager
20fe0 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65  Enter(pPg->pPage
20ff0 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d  r);.  pPg->nRef-
21000 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  -;..  CHECK_PAGE
21010 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
21020 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
21030 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
21040 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
21050 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
21060 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
21070 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
21080 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
21090 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
210a0 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74   ){..    lruList
210b0 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20 69 66  Add(pPg);.    if
210c0 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
210d0 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
210e0 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
210f0 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  or(pPg, pPager->
21100 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
21110 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
21120 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
21130 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
21140 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
21150 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
21160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21170 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
21180 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
21190 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
211a0 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
211b0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
211c0 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65  0 && (!pPager->e
211d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
211e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
211f0 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70  ff>0) ){.      p
21200 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
21210 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
21220 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
21230 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
21240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
21260 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
21270 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
21280 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
21290 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
212a0 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
212b0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
212c0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
212d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
212e0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
212f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21300 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
21310 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
21320 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
21330 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
21340 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
21350 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
21360 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
21370 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
21380 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
21390 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
213a0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
213b0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
213c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
213d0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
213e0 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
213f0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
21400 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
21410 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
21420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21430 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
21440 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
21450 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
21460 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
21470 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
21480 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
21490 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
214a0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
214b0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
214c0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
214d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
214e0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
214f0 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
21500 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
21510 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
21520 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
21530 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
21540 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21550 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
21560 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
21570 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
21580 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
21590 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  0 ){.    if( pPa
215a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
215b0 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
215c0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
215d0 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
215e0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
215f0 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NAL);.    }else{
21600 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
21610 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
21620 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
21630 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21640 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
21650 49 54 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ITE.    rc = sql
21660 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
21670 0a 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70  .        pVfs, p
21680 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21690 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
216a0 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
216b0 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
216c0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  );.#else.    rc 
216d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
216e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
216f0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
21700 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
21710 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
21720 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21730 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   || pPager->jfd-
21740 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20  >pMethods );.   
21750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21760 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Off = 0;.    pPa
21770 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
21780 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
21790 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
217a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
217b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
217c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
217d0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MEM ){.        s
217e0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
217f0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21800 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
21810 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61   }.      goto fa
21820 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
21830 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rnal;.    }.  }.
21840 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21850 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
21860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
21870 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
21880 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
21890 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
218a0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
218b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
218c0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
218d0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
218e0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
218f0 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
21900 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
21910 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
21920 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
21930 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
21940 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
21950 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21960 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
21970 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
21980 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
21990 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
219a0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
219b0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
219c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
219d0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
219e0 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
219f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21a00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
21a10 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
21a20 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
21a30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
21a50 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
21a60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21a70 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
21a80 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
21a90 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21aa0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
21ab0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
21ac0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21ad0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
21ae0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
21af0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
21b00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21b10 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
21b20 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
21b30 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
21b40 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
21b50 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
21b60 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
21b70 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
21b80 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
21b90 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
21ba0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
21bb0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
21bc0 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
21bd0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
21be0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
21bf0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
21c00 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
21c10 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
21c20 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
21c30 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
21c40 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
21c50 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
21c60 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
21c70 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
21c80 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
21c90 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
21ca0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
21cb0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
21cc0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
21cd0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
21ce0 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
21cf0 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
21d00 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
21d10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
21d20 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
21d30 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
21d40 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
21d50 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
21d60 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
21d70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
21d80 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
21d90 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
21da0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
21db0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
21dc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
21dd0 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
21de0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
21df0 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
21e00 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
21e10 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
21e20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21e30 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
21e40 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
21e50 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
21e60 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
21e70 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
21e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
21e90 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
21ea0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
21eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
21ec0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
21ed0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
21ee0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
21ef0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
21f00 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
21f10 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
21f20 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
21f30 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
21f40 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
21f50 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
21f60 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
21f70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
21f80 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
21f90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21fa0 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
21fb0 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
21fc0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
21fd0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
21fe0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
21ff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72  LITE_OK;.  pager
22000 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
22010 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
22020 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
22030 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
22040 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
22050 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
22060 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
22070 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
22080 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
22090 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
220a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
220b0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
220c0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
220d0 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
220e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
220f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
22100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
22110 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
22120 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
22130 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
22140 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22160 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22170 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
22180 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
22190 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
221a0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
221b0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
221c0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
221d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
221e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
221f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22200 20 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76         pagerLeav
22210 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
22220 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22230 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
22240 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
22250 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54   0;.      PAGERT
22260 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
22270 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
22280 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
22290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
222a0 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
222b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
222c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50             && pP
222d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
222e0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
222f0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
22300 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
22310 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
22320 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
22330 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
22340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22350 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
22360 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
22370 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
22380 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
22390 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
223a0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
223b0 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  he last.    ** t
223c0 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
223d0 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
223e0 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
223f0 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
22400 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
22410 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
22420 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
22430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
22440 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
22450 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72   open and either
22460 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
22470 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73  o 0 bytes or its
22480 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20   header was.    
22490 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
224a0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
224b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
224c0 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
224d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
224e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
224f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
22500 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
22510 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73  rnal==0 );.    s
22520 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
22530 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
22540 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
22550 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
22560 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
22570 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
22580 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64  reate( pPager->d
22590 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67  bSize );.    pag
225a0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
225b0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
225c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->pInJournal ){.
225d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
225e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
225f0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
22600 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
22610 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
22620 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
22630 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
22640 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
22650 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
22660 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
22670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22680 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
22690 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c  E_OK );.  pagerL
226a0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
226b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
226c0 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
226d0 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
226e0 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
226f0 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
22700 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
22710 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22720 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
22730 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
22740 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
22750 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
22760 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
22770 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
22780 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
22790 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
227a0 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
227b0 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
227c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
227d0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
227e0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
227f0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
22800 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
22810 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
22820 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
22830 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
22840 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
22850 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
22860 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
22870 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
22880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
22890 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
228a0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
228b0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
228c0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
228d0 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
228e0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
228f0 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e  t( pPg->pDirty->
22900 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20  pPrevDirty==pPg 
22910 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  );.      pPg->pD
22920 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
22930 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
22940 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
22950 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
22960 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
22970 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  t( pPg->pPrevDir
22980 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20  ty->pDirty==pPg 
22990 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  );.      pPg->pP
229a0 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
229b0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
229c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
229d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
229e0 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50  ager->pDirty==pP
229f0 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
22a00 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
22a10 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
22a20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
22a30 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
22a40 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
22a50 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
22a60 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
22a70 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
22a80 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
22a90 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
22aa0 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
22ab0 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
22ac0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
22ad0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
22ae0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
22af0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
22b00 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
22b10 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
22b20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
22b30 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
22b40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
22b50 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
22b60 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
22b70 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
22b80 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
22b90 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
22ba0 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
22bb0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
22bc0 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
22bd0 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
22be0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
22bf0 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
22c00 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
22c10 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
22c20 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
22c30 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
22c40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
22c50 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
22c60 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
22c70 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
22c80 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
22c90 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
22ca0 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
22cb0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
22cc0 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
22cd0 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
22ce0 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
22cf0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
22d00 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
22d10 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
22d20 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
22d30 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
22d40 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  Rollback() to.**
22d50 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
22d60 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
22d70 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
22d80 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50   void *pData = P
22d90 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22da0 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
22db0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
22dc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22dd0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
22de0 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
22df0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
22e00 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
22e10 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
22e20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
22e30 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
22e40 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
22e50 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
22e60 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
22e70 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
22e80 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
22e90 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  GE(pPg);..  /* I
22ea0 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20  f this page was 
22eb0 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
22ec0 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
22ed0 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e  nt==1, that mean
22ee0 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74  s.  ** we didn't
22ef0 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20   really read in 
22f00 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
22f10 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63  he page.  This c
22f20 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28  an happen.  ** (
22f30 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65  for example) whe
22f40 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
22f50 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  ing moved to the
22f60 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a   freelist.  But.
22f70 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20    ** now we are 
22f80 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67  (perhaps) moving
22f90 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66   the page off of
22fa0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f   the freelist fo
22fb0 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64  r.  ** reuse and
22fc0 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
22fd0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
22fe0 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f  ntent so that co
22ff0 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62  ntent.  ** can b
23000 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
23010 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
23020 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61  .  So do the rea
23030 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74  d at this.  ** t
23040 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ime..  */.  rc =
23050 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
23060 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72  nt(pPg);.  if( r
23070 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
23080 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rc;.  }..  /* Ma
23090 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
230a0 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
230b0 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
230c0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
230d0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
230e0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
230f0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
23100 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28   */.  makeDirty(
23110 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  pPg);.  if( pPg-
23120 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
23130 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
23140 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  Pg) || pPager->s
23150 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
23160 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
23170 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  yCache = 1;.    
23180 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
23190 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
231a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
231b0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
231c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
231d0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
231e0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
231f0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
23200 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
23210 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
23220 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
23230 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
23240 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
23250 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
23260 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
23270 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
23280 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
23290 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
232a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
232b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
232c0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
232d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
232e0 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
232f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
23300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23310 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23320 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23330 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
23340 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
23350 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
23360 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
23370 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
23380 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26  nal.          &&
23390 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
233a0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
233b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
233c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
233d0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
233e0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
233f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
23420 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20  tyCache = 1;.   
23430 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
23440 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
23450 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
23460 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
23470 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
23480 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
23490 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
234a0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
234b0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
234c0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
234d0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
234e0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
234f0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
23500 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
23510 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
23520 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
23530 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
23540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
23550 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
23560 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
23570 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
23580 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
23590 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
235a0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
235b0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
235c0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
235d0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
235e0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
235f0 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
23600 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
23610 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
23620 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
23630 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
23640 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
23650 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
23660 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 33 50 61  Orig = sqlite3Pa
23670 67 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  geMalloc( pPager
23680 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
23690 20 20 20 20 20 20 20 20 69 66 28 20 21 70 48 69          if( !pHi
236a0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
236b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
236c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
236d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
236e0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
236f0 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
23700 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
23710 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
23720 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23730 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
23740 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  um;.          ch
23750 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
23760 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
23770 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
23780 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
23790 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
237a0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
237b0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
237c0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
237d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
237e0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
237f0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
23800 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
23810 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
23820 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
23830 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
23840 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
23850 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
23860 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
23870 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
23880 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
23890 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
238a0 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
238b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
238c0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
238d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
238e0 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
238f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  no);.          i
23900 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23920 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
23930 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
23940 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
23950 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
23980 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
23990 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
239a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
239b0 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
239c0 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
239d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
239e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
239f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23a00 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
23a10 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
23a20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
23a30 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
23a40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
23a50 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
23a60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23a70 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
23a80 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
23a90 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
23aa0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
23ac0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23ad0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23ae0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze));.          
23af0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
23b00 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
23b10 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
23b20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a    PAGERTRACE5("J
23b30 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
23b40 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
23b50 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
23b70 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
23b80 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
23b90 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67  dSync, pager_pag
23ba0 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20 20  ehash(pPg));..  
23bb0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
23bc0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
23bd0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
23be0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
23bf0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
23c00 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
23c10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
23c20 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
23c30 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
23c40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
23c50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23c60 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
23c70 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
23c80 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
23c90 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
23ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23cb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
23cc0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
23cd0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
23ce0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
23cf0 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
23d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
23d10 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
23d20 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
23d30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
23d40 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
23d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23d60 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
23d70 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
23d80 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
23d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23db0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
23dc0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
23dd0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
23de0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
23df0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
23e00 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
23e10 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
23e20 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
23e30 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
23e40 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
23e50 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
23e60 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
23e70 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
23e80 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
23e90 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
23ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
23eb0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
23ec0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
23ed0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
23ee0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
23ef0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
23f00 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
23f10 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
23f20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
23f30 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
23f40 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
23f50 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
23f60 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
23f70 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
23f80 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
23f90 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
23fa0 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
23fb0 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
23fc0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
23fd0 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
23fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
23ff0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
24000 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
24010 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
24020 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
24030 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
24040 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
24050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24060 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
24070 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
24080 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
24090 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
240a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
240b0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
240c0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
240d0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
240e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
240f0 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
24100 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
24110 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
24120 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 50 61  3PageMalloc( pPa
24130 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
24140 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
24150 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
24160 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
24170 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
24180 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
24190 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
241a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
241b0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
241c0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
241d0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
241e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
241f0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
24200 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
24210 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
24220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24230 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
24240 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
24250 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
24260 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
24270 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
24280 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
24290 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
242a0 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  7);.        rc =
242b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
242c0 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65  ger->stfd, offse
242d0 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
242e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
242f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24310 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
24320 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
24330 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24340 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
24350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
24360 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
24370 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
24380 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
24390 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
243a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
243b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
243c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
243d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
243e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
243f0 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
24400 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
24410 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20  ger->pInStmt!=0 
24420 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24430 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
24440 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
24450 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
24460 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24470 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
24480 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
24490 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
244a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
244b0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
244c0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
244d0 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
244e0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
244f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
24500 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
24510 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
24520 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
24530 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
24540 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
24550 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
24560 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
24570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24580 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24590 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ion is used to m
245a0 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20  ark a data-page 
245b0 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20  as writable. It 
245c0 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77  uses .** pager_w
245d0 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61  rite() to open a
245e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
245f0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
24600 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64  ady open).** and
24610 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20   write the page 
24620 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f  *pData to the jo
24630 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
24640 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
24650 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
24660 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
24670 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
24680 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
24690 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
246a0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
246b0 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
246c0 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
246d0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
246e0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
246f0 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
24700 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
24710 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
24720 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
24730 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
24740 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
24750 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24760 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
24770 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24780 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
24790 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
247a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
247b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
247c0 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
247d0 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
247e0 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
247f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
24800 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
24810 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ger);.  if( !MEM
24820 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65  DB && nPagePerSe
24830 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
24840 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
24850 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
24860 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
24870 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
24880 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
24890 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
248a0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
248b0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
248c0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
248d0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
248e0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
248f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24900 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
24910 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
24920 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
24930 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
24940 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   = 0;..    /* Se
24950 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  t the doNotSync 
24960 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
24970 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
24980 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75  nnot allow a jou
24990 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64  rnal.    ** head
249a0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
249b0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
249c0 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20  es journaled by 
249d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
249e0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
249f0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
24a00 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ync==0 );.    pP
24a10 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
24a20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 1;..    /* Thi
24a30 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
24a40 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
24a50 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
24a60 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
24a70 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
24a80 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
24a90 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
24aa0 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
24ab0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
24ac0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
24ad0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
24ae0 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
24af0 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
24b00 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
24b10 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
24b20 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69  ) + 1;..    sqli
24b30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24b40 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
24b50 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
24b60 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
24b70 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
24b80 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
24b90 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
24ba0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
24bb0 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
24bc0 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
24bd0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
24be0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
24bf0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
24c00 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
24c10 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
24c20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
24c30 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
24c40 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
24c50 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
24c60 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
24c70 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
24c80 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
24c90 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
24ca0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
24cb0 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
24cc0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
24cd0 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
24ce0 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
24cf0 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
24d00 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
24d10 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
24d20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
24d30 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
24d40 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
24d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24d60 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
24d70 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
24d80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24da0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
24db0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
24dc0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
24dd0 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29  Page->needSync )
24de0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24df0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
24e00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
24e20 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
24e30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
24e50 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
24e60 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
24e70 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
24e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
24e90 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ge->needSync ){.
24ea0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
24eb0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
24ec0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24ed0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
24ee0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
24ef0 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
24f00 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
24f10 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
24f20 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
24f30 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
24f40 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
24f50 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
24f60 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
24f70 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
24f80 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
24f90 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
24fa0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
24fb0 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
24fc0 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
24fd0 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
24fe0 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
24ff0 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
25000 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
25010 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
25020 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
25030 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
25040 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  ){.      for(ii=
25050 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
25060 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
25070 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
25080 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
25090 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
250a0 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
250b0 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e   pPage ) pPage->
250c0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
250d0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
250e0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
250f0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
25100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25110 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
25120 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
25130 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
25140 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
25150 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
25160 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  e);.  }.  pagerL
25170 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
25180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25190 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
251a0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
251b0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
251c0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
251d0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
251e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
251f0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
25200 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
25210 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
25220 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
25230 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
25240 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
25250 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
25260 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
25270 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
25280 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
25290 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y;.}.#endif../*.
252a0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
252b0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
252c0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
252d0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
252e0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
252f0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
25300 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
25310 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
25320 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
25330 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
25340 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
25350 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
25360 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
25370 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
25380 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
25390 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
253a0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
253b0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
253c0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
253d0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
253e0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
253f0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
25400 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
25410 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
25420 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
25430 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
25440 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
25450 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
25460 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
25470 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
25480 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
25490 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
254a0 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
254b0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
254c0 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
254d0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
254e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
254f0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
25500 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
25510 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
25520 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
25530 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
25540 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
25550 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
25560 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
25570 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
25580 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
25590 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
255a0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
255b0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
255c0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
255d0 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
255e0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
255f0 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
25600 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
25610 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
25620 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
25630 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
25640 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
25650 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
25660 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
25670 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
25680 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
25690 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
256a0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
256b0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
256c0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
256d0 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
256e0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
256f0 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
25700 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
25710 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
25720 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
25730 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
25740 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
25750 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
25760 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
25770 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
25780 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25790 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
257a0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
257b0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
257c0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
257d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
257e0 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ager;..  if( MEM
257f0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  DB ) return;.  p
25800 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
25810 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
25820 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
25830 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
25840 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
25850 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
25860 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
25870 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
25880 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
25890 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
258a0 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
258b0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
258c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
258d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
258e0 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
258f0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
25900 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
25910 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
25920 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
25930 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
25940 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
25950 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
25960 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
25970 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
25980 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
25990 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
259a0 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
259b0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
259c0 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
259d0 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
259e0 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
259f0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
25a00 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
25a10 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
25a20 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
25a30 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
25a40 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
25a50 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
25a60 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
25a70 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
25a80 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
25a90 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
25aa0 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
25ab0 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
25ac0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
25ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
25ae0 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57  ERTRACE3("DONT_W
25af0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
25b00 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
25b10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
25b20 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
25b30 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
25b40 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
25b50 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61  >pgno)).      ma
25b60 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
25b70 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
25b80 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
25b90 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
25ba0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
25bb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
25bc0 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
25bd0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
25be0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
25bf0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
25c00 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
25c10 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
25c20 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
25c30 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
25c40 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
25c50 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
25c60 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
25c70 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
25c80 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
25c90 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
25ca0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
25cb0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
25cc0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
25cd0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
25ce0 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
25cf0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
25d00 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
25d10 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
25d20 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
25d30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
25d40 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
25d50 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
25d60 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
25d70 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
25d80 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
25d90 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
25da0 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
25db0 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
25dc0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
25dd0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
25de0 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
25df0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
25e00 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
25e10 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ager;..  pagerEn
25e20 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
25e30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
25e40 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
25e50 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
25e60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25e70 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
25e80 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
25e90 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
25ea0 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
25eb0 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
25ec0 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  s the alwaysRoll
25ed0 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e  back flag), then
25ee0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
25ef0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
25f00 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
25f10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
25f20 30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73  0 || pPg->always
25f30 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
25f40 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
25f50 63 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c  ck ){.    pagerL
25f60 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
25f70 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
25f80 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
25f90 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65  ;    /* For a me
25fa0 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  mdb, pPager->jou
25fb0 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61  rnalOpen is alwa
25fc0 79 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ys 0 */..#ifdef 
25fd0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
25fe0 4c 45 54 45 0a 20 20 69 66 28 20 70 50 67 2d 3e  LETE.  if( pPg->
25ff0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
26000 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20 70 50  t)pPg->pgno > pP
26010 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
26020 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
26030 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
26040 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54   If SECURE_DELET
26050 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  E is disabled, t
26060 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
26070 77 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  way that this.  
26080 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  ** routine can b
26090 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  e called on a pa
260a0 67 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c  ge for which sql
260b0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
260c0 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  te().  ** has no
260d0 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
260e0 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  y called during 
260f0 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
26100 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69  tion..  ** And i
26110 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  f DontWrite() ha
26120 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65  s previously bee
26130 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f  n called, the fo
26140 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e  llowing.  ** con
26150 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
26160 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  met..  **.  ** (
26170 4c 61 74 65 72 3a 29 20 20 4e 6f 74 20 74 72 75  Later:)  Not tru
26180 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
26190 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
261a0 20 62 79 20 68 61 76 69 6e 67 20 64 75 70 6c 69   by having dupli
261b0 63 61 74 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  cate.  ** pages 
261c0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
261d0 28 65 78 3a 20 63 6f 72 72 75 70 74 39 2e 74 65  (ex: corrupt9.te
261e0 73 74 29 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  st) then the fol
261f0 6c 6f 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20  lowing is not.  
26200 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ** necessarily t
26210 72 75 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61  rue:.  */.  /* a
26220 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a  ssert( !pPg->inJ
26230 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
26240 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
26250 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
26260 3b 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ; */..  assert( 
26270 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
26280 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al!=0 );.  sqlit
26290 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
262a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
262b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 50  pPg->pgno);.  pP
262c0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
262d0 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  ;.  pPg->needRea
262e0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  d = 0;.  if( pPa
262f0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
26300 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
26310 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3e  ager->stmtSize >
26320 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
26330 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  Size );.    sqli
26340 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
26350 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
26360 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
26370 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
26380 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
26390 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
263a0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
263b0 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
263c0 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70  ACE(("GARBAGE %p
263d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
263e0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70 61  pPg->pgno)).  pa
263f0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
26400 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
26410 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
26420 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
26430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26440 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
26450 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
26460 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
26470 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
26480 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
26490 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
264a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
264b0 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20  int isDirect){. 
264c0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
264d0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
264e0 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nter;.  int rc =
264f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
26500 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
26510 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
26520 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
26530 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
26540 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
26550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26560 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
26570 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
26580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26590 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
265a0 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63      if( !isDirec
265b0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
265c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
265d0 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  e(pPgHdr);.     
265e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
265f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
26600 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
26610 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20  pPgHdr);.       
26620 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26630 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
26640 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
26650 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
26660 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
26670 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
26680 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
26690 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
266a0 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
266b0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
266c0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
266d0 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
266e0 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
266f0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
26700 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
26710 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28  unter);..    if(
26720 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61   isDirect && pPa
26730 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
26740 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  s ){.      const
26750 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50 47   void *zBuf = PG
26760 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48  HDR_TO_DATA(pPgH
26770 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  dr);.      rc = 
26780 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
26790 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
267a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
267b0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 0);.    }..  
267c0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
267d0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
267e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
267f0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
26800 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
26810 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
26820 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
26830 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
26840 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
26850 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  e to disk..*/.in
26860 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
26870 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
26880 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
26890 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
268a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
268b0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
268c0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
268d0 5f 66 6c 61 67 73 29 3b 0a 20 20 70 61 67 65 72  _flags);.  pager
268e0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
268f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26900 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
26910 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
26920 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
26930 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
26940 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
26950 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
26960 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
26970 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
26980 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
26990 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
269a0 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
269b0 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
269c0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
269d0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
269e0 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
269f0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
26a00 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
26a10 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
26a20 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
26a30 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
26a40 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
26a50 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
26a60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
26a70 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
26a80 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
26a90 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
26aa0 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
26ab0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
26ac0 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
26ad0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
26ae0 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
26af0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
26b00 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
26b10 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
26b20 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
26b30 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
26b40 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
26b50 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
26b60 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
26b70 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
26b80 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
26b90 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
26ba0 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
26bb0 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
26bc0 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
26bd0 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
26be0 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
26bf0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
26c00 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
26c10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
26c20 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
26c30 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
26c40 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
26c50 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
26c60 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
26c70 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
26c80 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
26c90 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
26ca0 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
26cb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
26cc0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
26cd0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
26ce0 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
26cf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
26d00 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
26d10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
26d20 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
26d30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
26d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
26d50 61 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e  aster, .  Pgno n
26d60 54 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53  Trunc,.  int noS
26d70 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  ync.){.  int rc 
26d80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
26d90 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
26da0 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
26db0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
26dc0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  e;.  }..  /* If 
26dd0 6e 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20  no changes have 
26de0 62 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61  been made, we ca
26df0 6e 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e  n leave the tran
26e00 73 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20  saction early.. 
26e10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
26e20 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
26e30 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
26e40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
26e50 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26e60 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
26e70 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
26e80 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
26e90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
26ea0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
26eb0 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
26ec0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
26ed0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
26ee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
26ef0 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
26f00 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
26f10 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
26f20 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
26f30 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
26f40 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
26f50 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72  nTrunc);.  pager
26f60 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a  Enter(pPager);..
26f70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
26f80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
26f90 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
26fa0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
26fb0 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
26fc0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
26fd0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
26fe0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
26ff0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
27000 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
27010 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44  _SYNCED && !MEMD
27020 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72  B && pPager->dir
27030 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50  tyCache ){.    P
27040 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64  gHdr *pPg;..#ifd
27050 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
27060 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
27070 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d    /* The atomic-
27080 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
27090 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
270a0 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20  f all of the.   
270b0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72   ** following ar
270c0 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20  e true:.    **. 
270d0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66     **    + The f
270e0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
270f0 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
27100 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
27110 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c  r.    **      bl
27120 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67  ocks of size pag
27130 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20  e-size, and.    
27140 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d  **    + This com
27150 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
27160 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
27170 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
27180 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61  .    **    + Exa
27190 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
271a0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
271b0 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
271c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
271d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
271e0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
271f0 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68   can be used, th
27200 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27210 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20  ile will never. 
27220 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64     ** be created
27230 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
27240 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
27250 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57    int useAtomicW
27260 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  rite = (.       
27270 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20   !zMaster && .  
27280 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27290 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20  urnalOpen &&.   
272a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
272b0 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
272c0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
272d0 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75  && .        nTru
272e0 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  nc==0 && .      
272f0 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44    (0==pPager->pD
27300 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65  irty || 0==pPage
27310 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74  r->pDirty->pDirt
27320 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  y).    );.    as
27330 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
27340 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
27350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27360 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
27370 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
27380 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  f( useAtomicWrit
27390 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70  e ){.      /* Up
273a0 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
273b0 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eld in the journ
273c0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
273d0 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70    int offset = p
273e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
273f0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
27400 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
27410 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
27420 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nRec==1);.      
27430 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
27440 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66  (pPager->jfd, of
27450 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52  fset, pPager->nR
27460 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ec);..      /* U
27470 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
27480 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
27490 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
274a0 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
274b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
274c0 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
274d0 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
274e0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
274f0 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  updated.      **
27500 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
27510 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
27520 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74  age 1 directly t
27530 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
27540 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65       ** file. Be
27550 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
27560 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
27570 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
27580 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20  ile-system, .   
27590 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61     ** this is sa
275a0 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fe..      */.   
275b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
275c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
275d0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
275e0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
275f0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
27600 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
27610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
27620 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
27630 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
27640 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74  ..    if( !useAt
27650 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d  omicWrite && rc=
27660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e  =SQLITE_OK ).#en
27670 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  dif..    /* If a
27680 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
27690 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
276a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
276b0 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
276c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
276d0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
276e0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
276f0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
27700 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
27710 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
27720 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
27730 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
27740 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
27750 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
27760 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
27770 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
27780 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
27790 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
277a0 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
277b0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
277c0 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
277d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
277e0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
277f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
27800 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
27810 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
27820 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
27830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
27840 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
27850 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
27860 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
27870 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
27880 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  F ){.#ifndef SQL
27890 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
278a0 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
278b0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
278c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
278d0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
278e0 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
278f0 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
27900 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
27910 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
27920 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
27930 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
27940 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
27950 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
27960 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
27970 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27980 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
27990 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
279a0 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
279b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
279c0 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
279d0 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
279e0 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
279f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
27a00 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
27a10 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
27a20 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
27a30 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
27a40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
27a50 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
27a60 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a  ager, i, &pPg);.
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27a80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27a90 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
27aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27ac0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
27ad0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27ae0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
27af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
27b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27b10 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
27b20 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
27b30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 0a   }.          } .
27b40 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
27b50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
27b60 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
27b70 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
27b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27b90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27ba0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
27bb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63         rc = sync
27bc0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
27bd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27be0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27bf0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
27c00 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20  _exit;..#ifndef 
27c10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27c20 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
27c30 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
27c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27c50 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
27c60 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
27c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27c80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
27c90 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
27ca0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
27cb0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
27cc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
27cd0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
27ce0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
27cf0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
27d00 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
27d10 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
27d20 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
27d30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27d40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
27d60 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
27d70 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72      /* The error
27d80 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66 74   might have left
27d90 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
27da0 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65  all fouled up he
27db0 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74  re,.      ** but
27dc0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d   that does not m
27dd0 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69 66  atter because if
27de0 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72 74   the if the dirt
27df0 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20  y list did.     
27e00 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65   ** get corrupte
27e10 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e  d, then the tran
27e20 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c  saction will rol
27e30 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20  l back and.     
27e40 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20   ** discard the 
27e50 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65  dirty list.  The
27e60 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74 20  re is an assert 
27e70 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  in.      ** page
27e80 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
27e90 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65 72  pages() that ver
27ea0 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74  ifies that no at
27eb0 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69  tempt.      ** i
27ec0 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e  s made to use an
27ed0 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c   invalid dirty l
27ee0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
27ef0 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78      goto sync_ex
27f00 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  it;.    }.    pP
27f10 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
27f20 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
27f30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27f40 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
27f50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
27f60 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
27f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
27f80 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
27f90 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
27fa0 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
27fb0 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
27fc0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
27fd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
27fe0 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
27ff0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
28000 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
28010 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
28020 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
28030 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
28040 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
28050 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
28060 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
28070 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
28080 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
28090 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
280a0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
280b0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
280c0 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
280d0 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
280e0 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
280f0 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
28100 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
28110 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
28120 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
28130 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a  nt, it is.     *
28140 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
28150 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
28160 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
28170 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
28180 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
28190 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
281a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
281b0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
281c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
281d0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
281e0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
281f0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
28200 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
28210 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
28220 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
28230 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
28240 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
28250 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
28260 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
28270 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
28280 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
28290 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
282a0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
282b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
282c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
282d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
282e0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
282f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
28300 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
28310 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
28320 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
28330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28340 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
28350 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  ( pPager->dbModi
28360 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20  fied==0 &&.     
28370 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72     (pPager->jour
28380 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
28390 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
283a0 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
283b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
283c0 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20  Mode!=0) ){.    
283d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
283e0 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
283f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28400 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Open==0 );.    r
28410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28420 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65  .  }.  pagerEnte
28430 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50 41 47  r(pPager);.  PAG
28440 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54  ERTRACE2("COMMIT
28450 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28460 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
28470 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
28480 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
28490 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
284a0 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
284b0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67   pPg ){.      Pg
284c0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
284d0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
284e0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
284f0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
28500 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  pHist);.      pP
28510 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
28520 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
28530 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  al = 0;.      pH
28540 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
28550 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
28560 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
28570 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
28580 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
28590 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
285a0 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
285b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
285c0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
285d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
285e0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
285f0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
28600 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
28610 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
28620 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
28630 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
28640 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
28650 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
28660 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
28670 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
28680 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
28690 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
286a0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
286b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
286c0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
286d0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
286e0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
286f0 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
28700 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
28710 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28720 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
28730 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
28740 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61  R_SYNCED || !pPa
28750 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
28760 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
28770 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
28780 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
28790 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 63  setMaster);.  rc
287a0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
287b0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61  Pager, rc);.  pa
287c0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
287d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
287e0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
287f0 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
28800 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
28810 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
28820 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
28830 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
28840 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
28850 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
28860 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
28870 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
28880 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
28890 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
288a0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
288b0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
288c0 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
288d0 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
288e0 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
288f0 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
28900 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
28910 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
28920 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
28930 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
28940 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
28950 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
28960 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
28970 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
28980 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
28990 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
289a0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
289b0 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
289c0 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
289d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
289e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
289f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
28a00 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
28a10 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
28a20 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
28a30 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
28a40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28a50 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
28a60 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
28a70 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
28a80 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
28a90 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
28aa0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
28ab0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
28ac0 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
28ad0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
28ae0 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
28af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
28b00 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
28b10 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
28b20 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
28b30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28b40 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
28b50 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
28b60 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
28b70 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
28b80 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
28b90 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
28ba0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
28bb0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
28bc0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
28bd0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
28be0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
28bf0 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
28c00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28c10 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
28c20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
28c30 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
28c40 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
28c50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
28c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28c70 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
28c80 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
28c90 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
28ca0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
28cb0 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
28cc0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
28cd0 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
28ce0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
28cf0 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
28d00 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
28d10 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
28d20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
28d30 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
28d40 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
28d50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
28d60 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
28d70 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
28d80 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
28d90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
28da0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
28db0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
28dc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
28dd0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
28de0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
28df0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
28e00 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
28e10 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
28e20 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
28e30 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
28e40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
28e50 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
28e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28e70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61  TE_OK;.  }..  pa
28e80 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
28e90 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
28ea0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
28eb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28ec0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
28ed0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
28ee0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
28ef0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
28f00 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
28f10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
28f20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
28f30 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
28f40 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
28f50 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
28f60 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
28f70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
28f80 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
28f90 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
28fa0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
28fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
28fc0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
28fd0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
28fe0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
28ff0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
29000 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
29010 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
29020 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
29030 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
29040 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20  er, 0);.    rc2 
29050 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
29060 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
29070 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
29080 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
29090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
290a0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
290b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
290c0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
290d0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
290e0 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72    }.  /* pager_r
290f0 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f  eset(pPager); */
29100 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
29110 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  e = -1;..  /* If
29120 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
29130 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
29140 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
29150 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
29160 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e  ager.  ** cache.
29170 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
29180 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
29190 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
291a0 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65  y error .  ** pe
291b0 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
291c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
291d0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
291e0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
291f0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
29200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29210 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
29220 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
29230 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
29240 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
29250 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
29260 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
29270 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
29280 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
29290 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
292a0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
292b0 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
292c0 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
292d0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
292e0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
292f0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
29300 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
29310 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
29320 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
29330 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
29340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
29350 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
29360 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
29370 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
29380 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
29390 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
293a0 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
293b0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
293c0 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
293d0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
293e0 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
293f0 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
29400 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
29410 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
29420 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
29430 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
29440 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
29450 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
29460 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
29470 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
29480 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
29490 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
294a0 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
294b0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
294c0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
294d0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
294e0 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
294f0 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73 71  turn a;.}.int sq
29500 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64  lite3PagerIsMemd
29510 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  b(Pager *pPager)
29520 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42  {.  return MEMDB
29530 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
29540 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
29550 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
29560 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
29570 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
29580 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
29590 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
295a0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
295b0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
295c0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
295d0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
295e0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
295f0 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
29600 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
29610 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
29620 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
29630 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
29640 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65   int pagerStmtBe
29650 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
29660 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
29670 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
29680 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
29690 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
296a0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
296b0 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
296c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
296d0 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
296e0 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
296f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
29700 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
29710 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
29720 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
29730 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
29740 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
29750 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
29760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29770 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
29780 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
29790 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
297a0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
297b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
297c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
297d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
297e0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67  nalOpen );.  pag
297f0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
29800 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29810 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b  r->pInStmt==0 );
29820 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  .  pPager->pInSt
29830 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  mt = sqlite3Bitv
29840 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
29850 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65  >dbSize);.  page
29860 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
29870 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
29880 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
29890 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
298a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
298b0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
298c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
298d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
298e0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
298f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29900 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
29910 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
29920 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
29930 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
29940 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
29950 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
29960 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
29970 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
29980 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
29990 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
299a0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
299b0 61 67 65 72 2d 3e 73 74 66 64 2c 20 53 51 4c 49  ager->stfd, SQLI
299c0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
299d0 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  AL);.    if( rc 
299e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 74  ){.      goto st
299f0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
29a00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
29a10 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b  r->stmtOpen = 1;
29a20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
29a30 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
29a40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
29a50 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
29a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74   SQLITE_OK;. .st
29a70 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  mt_begin_failed:
29a80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
29a90 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  InStmt ){.    sq
29aa0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
29ab0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  oy(pPager->pInSt
29ac0 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
29ad0 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >pInStmt = 0;.  
29ae0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29b00 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72  rStmtBegin(Pager
29b10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
29b20 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   rc;.  pagerEnte
29b30 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
29b40 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e  = pagerStmtBegin
29b50 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
29b60 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
29b70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29b80 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
29b90 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
29ba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
29bb0 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
29bc0 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45  Pager){.  pagerE
29bd0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
29be0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
29bf0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
29c00 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
29c10 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
29c20 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
29c30 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29c40 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
29c50 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
29c60 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
29c70 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
29c80 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
29c90 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
29ca0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
29cb0 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  tmt);.      pPag
29cc0 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b  er->pInStmt = 0;
29cd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29ce0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
29cf0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
29d00 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
29d10 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
29d20 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
29d30 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
29d40 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d  .        pNext =
29d50 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
29d60 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
29d70 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  t( pHist->inStmt
29d80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
29d90 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
29da0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50         pHist->pP
29db0 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
29dc0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
29dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29de0 61 67 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  ageFree(pHist->p
29df0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
29e00 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
29e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
29e20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
29e30 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
29e40 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
29e50 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
29e60 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
29e70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
29e80 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67  oopen = 0;.  pag
29e90 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
29ea0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29eb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
29ec0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
29ed0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
29ee0 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
29ef0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
29f00 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
29f10 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
29f20 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
29f30 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
29f40 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
29f50 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
29f60 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29f70 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
29f80 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
29f90 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
29fa0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
29fb0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
29fc0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
29fd0 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70  Pg; pPg=pHist->p
29fe0 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
29ff0 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
2a000 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
2a010 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
2a020 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
2a030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
2a040 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
2a050 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
2a060 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
2a070 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
2a080 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
2a090 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
2a0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
2a0b0 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
2a0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a0d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2a0e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
2a0f0 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  tmtSize;.      p
2a100 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
2a110 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
2a120 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2a130 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
2a140 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73      rc = pager_s
2a150 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  tmt_playback(pPa
2a160 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
2a170 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
2a180 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  Commit(pPager);.
2a190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2a1a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2a1b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
2a1c0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  utoopen = 0;.  p
2a1d0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
2a1e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a1f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a200 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2a210 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a220 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
2a230 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
2a240 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
2a250 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2a260 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
2a270 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
2a280 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20   Return the VFS 
2a290 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
2a2a0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  e pager..*/.cons
2a2b0 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73  t sqlite3_vfs *s
2a2c0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50  qlite3PagerVfs(P
2a2d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a2e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2a2f0 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pVfs;.}../*.** R
2a300 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68  eturn the file h
2a310 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61  andle for the da
2a320 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
2a330 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2a340 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
2a350 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c  might return NUL
2a360 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61  L if the file ha
2a370 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65  s.** not yet bee
2a380 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  n opened..*/.sql
2a390 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74  ite3_file *sqlit
2a3a0 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65  e3PagerFile(Page
2a3b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2a3c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b  turn pPager->fd;
2a3d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a3e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
2a3f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a400 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
2a410 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
2a420 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
2a430 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2a440 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
2a450 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
2a460 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
2a470 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
2a480 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
2a490 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
2a4a0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
2a4b0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
2a4c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2a4d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
2a4e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2a4f0 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
2a500 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
2a510 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
2a520 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
2a530 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
2a540 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
2a550 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
2a560 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
2a570 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a580 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2a590 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
2a5a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2a5b0 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
2a5c0 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
2a5d0 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
2a5e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
2a5f0 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
2a600 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
2a610 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
2a620 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
2a630 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
2a640 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
2a650 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
2a660 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
2a670 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
2a680 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
2a690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2a6a0 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
2a6b0 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20  ve the page pPg 
2a6c0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
2a6d0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   in the file..**
2a6e0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
2a6f0 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
2a700 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76  to the page prev
2a710 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
2a720 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68  t.** pgno (which
2a730 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29   we call pPgOld)
2a740 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67   though that pag
2a750 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
2a760 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20  be.** in cache. 
2a770 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65   If the page pre
2a780 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74  vious located at
2a790 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
2a7a0 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
2a7b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
2a7c0 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
2a7d0 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
2a7e0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
2a7f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2a800 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
2a810 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
2a820 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
2a830 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
2a840 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
2a850 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
2a860 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
2a870 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
2a880 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
2a890 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2a8a0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2a8b0 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
2a8c0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
2a8d0 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
2a8e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2a8f0 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
2a900 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
2a910 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
2a920 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
2a930 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
2a940 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
2a950 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
2a960 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
2a970 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
2a980 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
2a990 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
2a9a0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
2a9b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a9c0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
2a9d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
2a9e0 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
2a9f0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
2aa00 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70  PgOld;  /* The p
2aa10 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
2aa20 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20  itten. */.  int 
2aa30 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
2aa40 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70  ncPgno = 0;..  p
2aa50 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
2aa60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2aa70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50  ->nRef>0 );..  P
2aa80 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45  AGERTRACE5("MOVE
2aa90 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
2aaa0 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
2aab0 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
2aac0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2aad0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
2aae0 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f  ->needSync, pgno
2aaf0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
2ab00 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
2ab10 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2ab20 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61  no, pgno))..  pa
2ab30 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
2ab40 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  pPg);.  if( pPg-
2ab50 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
2ab60 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
2ab70 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
2ab80 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
2ab90 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67  urnal || (int)pg
2aba0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
2abb0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
2abc0 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
2abd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2abe0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2abf0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
2ac00 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73  ink pPg from its
2ac10 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20   hash-chain */. 
2ac20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
2ac30 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a  (pPager, pPg);..
2ac40 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
2ac50 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
2ac60 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
2ac70 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
2ac80 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73  it.  ** from its
2ac90 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
2aca0 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
2acb0 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
2acc0 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
2acd0 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
2ace0 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
2acf0 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
2ad00 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
2ad10 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
2ad20 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
2ad30 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
2ad40 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   0;.  pPgOld = p
2ad50 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
2ad60 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
2ad70 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
2ad80 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
2ad90 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
2ada0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
2adb0 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
2adc0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
2add0 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  Old);.    pPg->n
2ade0 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64  eedSync = pPgOld
2adf0 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65  ->needSync;.  }e
2ae00 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  lse{.    pPg->ne
2ae10 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  edSync = 0;.  }.
2ae20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
2ae30 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
2ae40 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2ae50 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
2ae60 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
2ae70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
2ae80 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20   pPg and insert 
2ae90 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  it into the new 
2aea0 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash-chain. */. 
2aeb0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
2aec0 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   );.  pPg->pgno 
2aed0 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67  = pgno;.  h = pg
2aee0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
2aef0 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50  ash-1);.  if( pP
2af00 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
2af10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2af20 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
2af30 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
2af40 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
2af50 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
2af60 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
2af70 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
2af80 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
2af90 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
2afa0 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
2afb0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
2afc0 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
2afd0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
2afe0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70  tyCache = 1;.  p
2aff0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2b000 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  d = 1;..  if( ne
2b010 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
2b020 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
2b030 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
2b040 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
2b050 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
2b060 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
2b070 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
2b080 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
2b090 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
2b0a0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
2b0b0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
2b0c0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
2b0d0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
2b0e0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
2b0f0 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
2b100 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2b110 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
2b120 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
2b130 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
2b140 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
2b150 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
2b160 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
2b170 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
2b180 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
2b190 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2b1a0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
2b1b0 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
2b1c0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
2b1d0 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
2b1e0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
2b1f0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
2b200 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
2b210 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
2b220 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
2b230 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
2b240 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
2b250 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
2b260 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
2b270 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
2b280 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
2b290 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
2b2a0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
2b2b0 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
2b2c0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
2b2d0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
2b2e0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
2b2f0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
2b300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
2b310 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
2b320 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
2b330 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b340 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2b350 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
2b360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
2b370 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
2b380 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
2b390 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
2b3a0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
2b3b0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
2b3c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
2b3d0 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
2b3e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b3f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
2b400 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2b410 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
2b420 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
2b430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
2b450 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b460 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53  al && (int)needS
2b470 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
2b480 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
2b490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
2b4a0 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
2b4b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
2b4c0 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20  edSyncPgno);.   
2b4d0 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
2b4e0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
2b4f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2b500 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
2b510 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
2b520 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
2b530 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
2b540 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
2b550 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
2b560 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
2b570 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b580 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
2b590 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
2b5a0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
2b5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
2b5c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2b5d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2b5e0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
2b5f0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
2b600 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
2b610 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
2b620 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
2b630 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
2b640 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
2b650 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2b660 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
2b670 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
2b680 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
2b690 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
2b6a0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
2b6b0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
2b6c0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
2b6d0 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
2b6e0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2b6f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2b700 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
2b710 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58  ager?PGHDR_TO_EX
2b720 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
2b730 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
2b740 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
2b750 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
2b760 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
2b770 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
2b780 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
2b790 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
2b7a0 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
2b7b0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
2b7c0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
2b7d0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
2b7e0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
2b7f0 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
2b800 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
2b810 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
2b820 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
2b830 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
2b840 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
2b850 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
2b860 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2b870 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
2b880 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2b890 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
2b8a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
2b8b0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
2b8c0 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
2b8d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b8e0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
2b8f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2b900 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
2b910 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
2b920 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
2b930 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
2b940 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
2b950 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2b960 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
2b970 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
2b980 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2b990 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
2b9a0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2b9b0 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
2b9c0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2b9d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2b9e0 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
2b9f0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2ba00 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
2ba10 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
2ba20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
2ba30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
2ba40 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
2ba50 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
2ba60 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
2ba70 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
2ba80 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
2ba90 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
2baa0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
2bab0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
2bac0 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
2bad0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2bae0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
2baf0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
2bb00 54 45 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  TE or .** PAGER_
2bb10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2bb20 49 53 54 2e 20 49 66 20 74 68 65 20 70 61 72 61  IST. If the para
2bb30 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
2bb40 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
2bb50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
2bb60 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
2bb70 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
2bb80 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
2bb90 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
2bba0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bbb0 45 5f 44 45 4c 45 54 45 20 6f 72 0a 2a 2a 20 50  E_DELETE or.** P
2bbc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2bbd0 5f 50 45 52 53 49 53 54 2c 20 69 6e 64 69 63 61  _PERSIST, indica
2bbe0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
2bbf0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
2bc00 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d  ed).** journal-m
2bc10 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
2bc20 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
2bc30 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
2bc40 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
2bc50 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
2bc60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bc70 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
2bc80 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
2bc90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bca0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
2bcb0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2bcc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2bcd0 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
2bce0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2bcf0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2bd00 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  FF );.  assert( 
2bd10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bd20 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
2bd30 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
2bd40 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3e  RNALMODE_DELETE>
2bd50 3d 30 20 26 26 20 50 41 47 45 52 5f 4a 4f 55 52  =0 && PAGER_JOUR
2bd60 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3e  NALMODE_PERSIST>
2bd70 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
2bd80 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
2bd90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
2bda0 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  = eMode;.  }.  r
2bdb0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
2bdc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
2bdd0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
2bde0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
2bdf0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
2be00 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2be10 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  s..*/.i64 sqlite
2be20 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
2be30 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
2be40 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
2be50 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
2be60 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
2be70 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2be80 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
2be90 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
2bea0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2beb0 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  mit;.}..#endif /
2bec0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
2bed0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.