/ Hex Artifact Content
Login

Artifact fd4e176cbd9dbf09d59406b8346e2c00eeda2999:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 33  : pager.c,v 1.43
0350: 37 20 32 30 30 38 2f 30 35 2f 30 31 20 31 37 3a  7 2008/05/01 17:
0360: 30 33 3a 34 39 20 64 72 68 20 45 78 70 20 24 0a  03:49 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4000: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4010: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4020: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4030: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33  -counter */.  u3
4040: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4060: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4070: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4080: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
40a0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
40b0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
40c0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
40f0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
4100: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
4110: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4120: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
4130: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
4140: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
4150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4160: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
4170: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
4180: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
4190: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41c0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
41d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
41e0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
41f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4200: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
4210: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
4220: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
4230: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
4260: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
4270: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
4280: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
4290: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
42a0: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
42b0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
42c0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
42d0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
42e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
4300: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
4310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4320: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
4330: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
4340: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
4350: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
4360: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4370: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
4380: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
4390: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
43a0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
43b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
43d0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
43e0: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
43f0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4400: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
4410: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4430: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
4440: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
4450: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4460: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4480: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
4490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44a0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
44b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
44c0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
44d0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
44e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
44f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
4520: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
4530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4540: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
4550: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
4560: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
4570: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
4580: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
4590: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a  /.  char *zStmtJ
45a0: 72 6e 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  rnl;            
45b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
45c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
45d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
45e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
45f0: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4600: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4610: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4620: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4630: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4640: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4650: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
4660: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4670: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
4680: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4690: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
46a0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
46b0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
46c0: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
46d0: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
46e0: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
46f0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
4700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4710: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4720: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4730: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4750: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4760: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4770: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
4780: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
4790: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
47a0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
47b0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
47c0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
47d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
47e0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
47f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4830: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4840: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4850: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4870: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
4880: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
4890: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
48a0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
48c0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
48d0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
48e0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
48f0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4900: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
4910: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4920: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4930: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4940: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4950: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
4960: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
4970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4980: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
4990: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
49a0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
49b0: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
49c0: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
49d0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
49e0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
49f0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
4a00: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
4a10: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a20: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a40: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4a60: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4a70: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4a80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a90: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4aa0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4ab0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4ac0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4ad0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4ae0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4af0: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4b00: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4b10: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b30: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b40: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b50: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b70: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4b80: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4b90: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bb0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4bc0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4bd0: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4be0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4bf0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4c00: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c20: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c30: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c40: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c50: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4c70: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4c80: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d  */.  int iInUseM
4ca0: 4d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M;              
4cb0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4cc0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4cd0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73  M */.  int iInUs
4ce0: 65 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20  eDB;            
4cf0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d00: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4d10: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d20: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d30: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d40: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4d60: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4d70: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4d80: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4d90: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4da0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4db0: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4dc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4dd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4de0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4df0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4e00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4e10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4e20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4e30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4e40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4e50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4e60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4e70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4e80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4e90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4ea0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4eb0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4ec0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4ed0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4ee0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4ef0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4f00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4f10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4f20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4f30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4f50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4f60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4f70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69   to journal */.i
4f80: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f90: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20  _pgfree_count = 
4fa0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4fb0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66  of cache pages f
4fc0: 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65  reed */.# define
4fd0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
4fe0: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
4ff0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
5000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
5020: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
5030: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f  the head of a do
5040: 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  uble-linked list
5050: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72  .** of all pager
5060: 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69  s that are eligi
5070: 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65  ble for page ste
5080: 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  aling by the.** 
5090: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
50a0: 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61  memory() interfa
50b0: 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74  ce.  Access to t
50c0: 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70  his list is.** p
50d0: 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20  rotected by the 
50e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
50f0: 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a  TIC_MEM2 mutex..
5100: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5110: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5120: 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63  ANAGEMENT.static
5130: 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50   Pager *sqlite3P
5140: 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74  agerList = 0;.st
5150: 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73  atic PagerLruLis
5160: 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  t sqlite3LruPage
5170: 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  List = {0, 0, 0}
5180: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
5190: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
51a0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
51b0: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
51c0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
51d0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
51e0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
51f0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
5200: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
5210: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
5220: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
5230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
5240: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
5250: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
5260: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
5270: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
5280: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
5290: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
52a0: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
52b0: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
52c0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
52d0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
52e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
52f0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
5300: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
5310: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
5320: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
5330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
5340: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
5350: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
5360: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
5370: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
5380: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
5390: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
53a0: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
53b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
53c0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
53d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
53e0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
53f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
5400: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
5410: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
5420: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
5430: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
5440: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
5450: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
5460: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
5470: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
5480: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
5490: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
54a0: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
54b0: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
54c0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
54d0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
54e0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
54f0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
5500: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
5510: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
5520: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
5530: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
5540: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
5550: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
5560: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
5570: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5580: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
5590: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
55a0: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
55b0: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
55c0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
55d0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
55e0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
55f0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
5600: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
5610: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
5620: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
5630: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
5640: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
5650: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
5660: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
5670: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
5680: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
5690: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
56a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
56b0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
56c0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
56d0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
56e0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
56f0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
5700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
5710: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
5720: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
5730: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
5740: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
5750: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
5760: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
5770: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
5780: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
5790: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
57a0: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
57b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
57c0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
57d0: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
57e0: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
57f0: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
5800: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
5810: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
5820: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
5830: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
5840: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
5850: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
5860: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
5870: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
5880: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5890: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
58a0: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
58b0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
58c0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
58d0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
58e0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
58f0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
5900: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
5910: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
5920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5930: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
5940: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
5950: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
5960: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
5970: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
5980: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
5990: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
59a0: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
59b0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
59c0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
59d0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
59e0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
59f0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
5a00: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
5a10: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
5a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
5a30: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
5a40: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5a50: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
5a60: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
5a70: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
5a80: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
5a90: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
5aa0: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
5ab0: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
5ac0: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
5ad0: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5ae0: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
5af0: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
5b00: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
5b10: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
5b20: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
5b30: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
5b40: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
5b50: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
5b60: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
5b70: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
5b80: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47  /./* #define PAG
5b90: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50  ER_MJ_PGNO(x) (P
5ba0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5bb0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a  ->pageSize)) */.
5bc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5bd0: 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49  _PGNO(x) ((PENDI
5be0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5bf0: 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a  geSize))+1)../*.
5c00: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
5c10: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
5c20: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
5c30: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5c40: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
5c50: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
5c60: 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64  pagerEnter() and
5c70: 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f   pagerLeave() ro
5c80: 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61  utines acquire a
5c90: 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20  nd release.** a 
5ca0: 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61  mutex on each pa
5cb0: 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20  ger.  The mutex 
5cc0: 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a  is recursive..**
5cd0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70  .** This is a sp
5ce0: 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  ecial-purpose mu
5cf0: 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72  tex.  It only pr
5d00: 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78  ovides mutual ex
5d10: 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  clusion.** betwe
5d20: 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64  en the Btree and
5d30: 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61   the Memory Mana
5d40: 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72  gement sqlite3_r
5d50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a  elease_memory().
5d60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74  ** function.  It
5d70: 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e   does not preven
5d80: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5d90: 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20  two Btrees from 
5da0: 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65  accessing.** the
5db0: 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74   same pager at t
5dc0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f  he same time.  O
5dd0: 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72  ther general-pur
5de0: 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a  pose mutexes in.
5df0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
5e00: 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63  er handle that c
5e10: 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  hore..*/.#ifdef 
5e20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
5e30: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
5e40: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5e50: 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a  gerEnter(Pager *
5e60: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
5e70: 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  eDB++;.    if( p
5e80: 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d  ->iInUseMM && p-
5e90: 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a  >iInUseDB==1 ){.
5ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5eb0: 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20  tex *mutex;.    
5ec0: 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
5ed0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
5ee0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5ef0: 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70  C_MEM2);.      p
5f00: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
5f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f20: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
5f30: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73  ;.      p->iInUs
5f40: 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eDB = 1;.      s
5f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5f60: 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ve(mutex);.    }
5f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f80: 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20  iInUseMM==0 );. 
5f90: 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
5fa0: 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65   pagerLeave(Page
5fb0: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5fc0: 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73  nUseDB--;.    as
5fd0: 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44  sert( p->iInUseD
5fe0: 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  B>=0 );.  }.#els
5ff0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
6000: 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e  Enter(X).# defin
6010: 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a  e pagerLeave(X).
6020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
6030: 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  d page pPg to th
6040: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e  e end of the lin
6050: 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64  ked list managed
6060: 20 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a   by structure.**
6070: 20 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f   pList (pPg beco
6080: 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74  mes the last ent
6090: 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d  ry in the list -
60a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
60b0: 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72  ly .** used). Ar
60c0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
60d0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
60e0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
60f0: 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20   pPg->gfree,.** 
6100: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
6110: 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e  ther pPg is bein
6120: 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  g added to the p
6130: 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72  ager-specific or
6140: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c  .** global LRU l
6150: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
6160: 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65  oid listAdd(Page
6170: 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c  rLruList *pList,
6180: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
6190: 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67  Link, PgHdr *pPg
61a0: 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  ){.  pLink->pNex
61b0: 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e  t = 0;.  pLink->
61c0: 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70  pPrev = pList->p
61d0: 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Last;..#ifdef SQ
61e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
61f0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6200: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6210: 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e  Pg->free || pLin
6220: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b  k==&pPg->gfree);
6230: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
6240: 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20  =&pPg->gfree || 
6250: 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c  pList!=&sqlite3L
6260: 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e  ruPageList);.#en
6270: 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  dif..  if( pList
6280: 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ->pLast ){.    i
6290: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
62a0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
62b0: 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72  *)pPg;.    Pager
62c0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69  LruLink *pLastLi
62d0: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
62e0: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
62f0: 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66  ist->pLast)[iOff
6300: 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e  ]);.    pLastLin
6310: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a  k->pNext = pPg;.
6320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6330: 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72  ert(!pList->pFir
6340: 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  st);.    pList->
6350: 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
6360: 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73  }..  pList->pLas
6370: 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21  t = pPg;.  if( !
6380: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6390: 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64  ced && pPg->need
63a0: 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Sync==0 ){.    p
63b0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
63c0: 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ed = pPg;.  }.}.
63d0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50  ./*.** Remove pP
63e0: 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  g from the list 
63f0: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73  managed by the s
6400: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
6410: 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a   to by pList..**
6420: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69  .** Argument pLi
6430: 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20  nk should point 
6440: 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66  to either pPg->f
6450: 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65  ree or pPg->gfre
6460: 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a  e, depending .**
6470: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
6480: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
6490: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
64a0: 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c  ific or global L
64b0: 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  RU list..*/.stat
64c0: 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f  ic void listRemo
64d0: 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ve(PagerLruList 
64e0: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
64f0: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6500: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
6510: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6520: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6530: 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
6540: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
6550: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73  _MANAGEMENT.  as
6560: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6570: 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d  ->free || pLink=
6580: 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20  =&pPg->gfree);. 
6590: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
65a0: 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c  pPg->gfree || pL
65b0: 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75  ist!=&sqlite3Lru
65c0: 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69  PageList);.#endi
65d0: 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c  f..  if( pPg==pL
65e0: 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20  ist->pFirst ){. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6600: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
6610: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
6620: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a  pList->pLast ){.
6630: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74      pList->pLast
6640: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b   = pLink->pPrev;
6650: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b  .  }.  if( pLink
6660: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50  ->pPrev ){.    P
6670: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72  agerLruLink *pPr
6680: 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  evLink = (PagerL
6690: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
66a0: 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b  *)pLink->pPrev)[
66b0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65  iOff]);.    pPre
66c0: 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  vLink->pNext = p
66d0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Link->pNext;.  }
66e0: 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e  .  if( pLink->pN
66f0: 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ext ){.    Pager
6700: 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69  LruLink *pNextLi
6710: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
6720: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
6730: 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66  ink->pNext)[iOff
6740: 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e  ]);.    pNextLin
6750: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b  k->pPrev = pLink
6760: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
6770: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6780: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
6790: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c     PgHdr *p = pL
67a0: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ink->pNext;.    
67b0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
67c0: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
67d0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
67e0: 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  L = (PagerLruLin
67f0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b  k *)(&((u8 *)p)[
6800: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20  iOff]);.      p 
6810: 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pL->pNext;.   
6820: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46   }.    pList->pF
6830: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
6840: 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e    }..  pLink->pN
6850: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ext = pLink->pPr
6860: 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ev = 0;.}../* .*
6870: 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74  * Add page pPg t
6880: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  o the list of fr
6890: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
68a0: 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d   pager. If .** m
68b0: 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
68c0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73   is enabled, als
68d0: 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  o add the page t
68e0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a  o the global .**
68f0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6900: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ges..*/.static v
6910: 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50  oid lruListAdd(P
6920: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69  gHdr *pPg){.  li
6930: 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67  stAdd(&pPg->pPag
6940: 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66  er->lru, &pPg->f
6950: 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65  ree, pPg);.#ifde
6960: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6970: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
6980: 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50  T.  if( !pPg->pP
6990: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
69a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
69b0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
69c0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
69d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
69e0: 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64  RU));.    listAd
69f0: 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  d(&sqlite3LruPag
6a00: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6a10: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6a20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6a30: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6a40: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6a50: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6a60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6a70: 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67  * .** Remove pag
6a80: 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c  e pPg from the l
6a90: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
6aa0: 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69  s for the associ
6ab0: 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49  ated pager..** I
6ac0: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6ad0: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6ae0: 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20  also remove pPg 
6af0: 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20  from the global 
6b00: 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20  list.** of free 
6b10: 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
6b20: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d   void lruListRem
6b30: 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ove(PgHdr *pPg){
6b40: 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70  .  listRemove(&p
6b50: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c  Pg->pPager->lru,
6b60: 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67   &pPg->free, pPg
6b70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6b80: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
6b90: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
6ba0: 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65  !pPg->pPager->me
6bb0: 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
6bc0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6be0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6bf0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6c00: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71    listRemove(&sq
6c10: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6c20: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6c30: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
6c40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6c50: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
6c60: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6c70: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
6c80: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
6c90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ca0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66  s called just af
6cb0: 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ter the needSync
6cc0: 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63   flag has been c
6cd0: 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  leared.** from a
6ce0: 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64  ll pages managed
6cf0: 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61   by pPager (usua
6d00: 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  lly because the 
6d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
6d20: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79  has just been sy
6d30: 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65  nced). It update
6d40: 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72  s the pPager->lr
6d50: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76  u.pFirstSynced v
6d60: 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20  ariable.** and, 
6d70: 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
6d80: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6d90: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50   the sqlite3LruP
6da0: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6db0: 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65  nced.** variable
6dc0: 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
6dd0: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74   void lruListSet
6de0: 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65  FirstSynced(Page
6df0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
6e00: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6e10: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
6e20: 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66  >lru.pFirst;.#if
6e30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6e40: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6e50: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65  ENT.  if( !pPage
6e60: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6e70: 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71  PgHdr *p;.    sq
6e80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6e90: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6ea0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6eb0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6ec0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
6ed0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6ee0: 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65  irst; p && p->ne
6ef0: 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72  edSync; p=p->gfr
6f00: 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61  ee.pNext);.    a
6f10: 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d  ssert(p==pPager-
6f20: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6f30: 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c  d || p==sqlite3L
6f40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6f50: 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71  tSynced);.    sq
6f60: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6f70: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6f80: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  p;.    sqlite3_m
6f90: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6fa0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6fb0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6fc0: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65  IC_LRU));.  }.#e
6fd0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
6fe0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67  turn true if pag
6ff0: 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61  e *pPg has alrea
7000: 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
7010: 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
7020: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20  .** journal (or 
7030: 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68  statement snapsh
7040: 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ot has been crea
7050: 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20  ted, if *pPg is 
7060: 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e  part.** of an in
7070: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
7080: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
7090: 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74   pageInStatement
70a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
70b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
70c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
70d0: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
70e0: 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
70f0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
7100: 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c  )->inStmt;.  }el
7110: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  se{.    return s
7120: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
7130: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
7140: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
7150: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7160: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
7170: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
7180: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
7190: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
71a0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
71b0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
71c0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
71d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
71e0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
71f0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
7200: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
7210: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66  (N-1))==0 );.#if
7220: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  def SQLITE_MALLO
7230: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69  C_SOFT_LIMIT.  i
7240: 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73  f( N*sizeof(aHas
7250: 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c  h[0])>SQLITE_MAL
7260: 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29  LOC_SOFT_LIMIT )
7270: 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45  {.    N = SQLITE
7280: 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d  _MALLOC_SOFT_LIM
7290: 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b  IT/sizeof(aHash[
72a0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  0]);.  }.  if( N
72b0: 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  ==pPager->nHash 
72c0: 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66  ) return;.#endif
72d0: 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
72e0: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
72f0: 46 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49  FaultBenign(SQLI
7300: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
7310: 5f 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72 2d  _MALLOC, pPager-
7320: 3e 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61 48  >aHash!=0);.  aH
7330: 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ash = sqlite3Mal
7340: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
7350: 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20  aHash[0])*N );. 
7360: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e   sqlite3FaultBen
7370: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
7380: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c  INJECTOR_MALLOC,
7390: 20 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   0);.  pagerEnte
73a0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
73b0: 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20   aHash==0 ){.   
73c0: 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72   /* Failure to r
73d0: 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20  ehash is not an 
73e0: 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e  error.  It is on
73f0: 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ly a performance
7400: 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74   hit. */.    ret
7410: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
7420: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
7430: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
7440: 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70  ->nHash = N;.  p
7450: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61  Pager->aHash = a
7460: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Hash;.  for(pPg=
7470: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
7480: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
7490: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68  tAll){.    int h
74a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
74b0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gno==0 ){.      
74c0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
74d0: 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
74e0: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
74f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
7500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20  ;.    }.    h = 
7510: 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31  pPg->pgno & (N-1
7520: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7530: 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d  tHash = aHash[h]
7540: 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b  ;.    if( aHash[
7550: 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73  h] ){.      aHas
7560: 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
7570: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7580: 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b   aHash[h] = pPg;
7590: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
75a0: 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ash = 0;.  }.}..
75b0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
75c0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
75d0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
75e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
75f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
7600: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
7610: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
7620: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
7630: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
7640: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
7650: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
7660: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
7670: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
7680: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
7690: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
76a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
76b0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
76c0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
76d0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
76e0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
76f0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
7700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
7710: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
7720: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
7730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
7750: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
7760: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
7770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7780: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7790: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
77a0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
77b0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
77c0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
77d0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
77e0: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
77f0: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f  yte((u8*)A,B)../
7800: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
7810: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
7820: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
7830: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
7840: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
7850: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
7860: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7870: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7880: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
7890: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
78a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
78b0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
78c0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
78d0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
78e0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
78f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
7900: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
7910: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
7920: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
7930: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
7940: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
7950: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
7960: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
7970: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
7980: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
7990: 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  !pFd->pMethods )
79a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
79b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
79c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
79d0: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
79f0: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
7a00: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
7a10: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
7a20: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
7a30: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
7a40: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
7a50: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
7a60: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
7a70: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
7a80: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
7a90: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
7aa0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
7ab0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
7ac0: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
7ad0: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
7ae0: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
7af0: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
7b00: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b10: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
7b20: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
7b30: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
7b40: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
7b50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
7b60: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
7b70: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
7b80: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
7b90: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
7ba0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
7bb0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
7bc0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7bd0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
7be0: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
7bf0: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
7c00: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
7c10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7c20: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
7c30: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
7c40: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
7c50: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7c60: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
7c70: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
7c80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
7c90: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
7ca0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
7cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
7cc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ;        /* Page
7cd0: 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74   size */.  sqlit
7ce0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
7cf0: 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28  ager->fd;..  if(
7d00: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
7d10: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
7d20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
7d30: 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20  eristics(fd);.  
7d40: 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69    nSector = sqli
7d50: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
7d60: 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d  fd);.    nPage =
7d70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7d80: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
7d90: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
7da0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
7db0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
7dc0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7dd0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
7de0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
7df0: 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53  ethods || (dc&(S
7e00: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e10: 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26  IC|(nPage>>8))&&
7e20: 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20  nSector<=nPage) 
7e30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f  ){.    return JO
7e40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7e50: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
7e60: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
7e70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7e80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
7e90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7ea0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ld be called whe
7eb0: 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  n an error occur
7ec0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
7ed0: 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20  er.** code. The 
7ee0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
7ef0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7f00: 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
7f10: 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  re, the.** secon
7f20: 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  d the error-code
7f30: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
7f40: 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
7f50: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a   API function. .
7f60: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
7f70: 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
7f80: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
7f90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
7fa0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
7fb0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
7fc0: 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
7fd0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
7fe0: 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
7ff0: 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
8000: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
8010: 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
8020: 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f  e persisten erro
8030: 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a  r is cleared,.**
8040: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
8050: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
8060: 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
8070: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
8080: 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63  same .** error c
8090: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72  ode..**.** A per
80a0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e  sistent error in
80b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
80c0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
80d0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
80e0: 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
80f0: 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
8100: 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
8110: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
8120: 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
8130: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8140: 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
8150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
8160: 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
8170: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
8180: 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68  rror occured, th
8190: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
81a0: 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
81b0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
81c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
81d0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
81e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
81f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8200: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
8210: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
8220: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
8230: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
8240: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
8250: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
8260: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
8270: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8280: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
8290: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
82a0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
82b0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
82c0: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
82d0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
82e0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
82f0: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
8310: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
8320: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
8330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8340: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
8350: 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
8360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
8370: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8380: 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64  already unlocked
8390: 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c  , call pager_unl
83a0: 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20  ock() now to.   
83b0: 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20     ** clear the 
83c0: 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
83d0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
83e0: 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a  pager-cache is .
83f0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74        ** complet
8400: 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20  ely empty..     
8410: 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
8420: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
8430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8440: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8450: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
8460: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
8470: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
8480: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8490: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
84a0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
84b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
84c0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
84d0: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
84e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
84f0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
8500: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
8510: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
8520: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
8530: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
8540: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
8550: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
8560: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
8570: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
8580: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
8590: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
85a0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
85b0: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
85c0: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
85d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
85e0: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
85f0: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
8600: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
8610: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
8620: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
8630: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
8640: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8650: 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67            (unsig
8660: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
8670: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29  _TO_DATA(pPage))
8680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
8690: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
86a0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
86b0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
86c0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
86d0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
86e0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
86f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
8700: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
8710: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
8720: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8730: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
8740: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
8750: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
8760: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
8770: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
8780: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
8790: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
87a0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
87b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
87c0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
87d0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
87e0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
87f0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d  er->errCode || M
8800: 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72  EMDB || pPg->dir
8810: 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67  ty || .      pPg
8820: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
8830: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
8840: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
8850: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
8860: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
8870: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
8880: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
8890: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
88a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
88b0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
88c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
88d0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
88e0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
88f0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
8900: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8910: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8920: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
8930: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
8940: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
8950: 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  plied by the cal
8960: 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  ler. .**.** zMas
8970: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
8980: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
8990: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
89a0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
89b0: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
89c0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
89d0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
89e0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
89f0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
8a00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
8a10: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
8a20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
8a30: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
8a40: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
8a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8a60: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
8a70: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
8a80: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
8a90: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
8aa0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
8ab0: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
8ac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
8ad0: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
8ae0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
8af0: 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20  ** If no master 
8b00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8b10: 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61  e is present zMa
8b20: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
8b30: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
8b40: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
8b50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8b60: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
8b70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
8b80: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
8b90: 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  r, int nMaster){
8ba0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
8bb0: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
8bc0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
8bd0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
8be0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
8bf0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
8c00: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8c10: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
8c20: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
8c30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8c40: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
8c50: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
8c60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
8c70: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
8c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
8c90: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
8ca0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
8cb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8cc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8cd0: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
8ce0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
8d00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d10: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
8d20: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
8d30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8d40: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8d50: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d60: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
8d70: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
8d80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8d90: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
8db0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
8dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8dd0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
8de0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
8df0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
8e00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8e10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8e20: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
8e30: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
8e40: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
8e50: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
8e60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8e70: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
8e80: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
8e90: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
8ea0: 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[i];.   }.  if(
8eb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
8ec0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
8ed0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
8ee0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
8ef0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
8f00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
8f10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
8f20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
8f30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
8f40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
8f50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
8f60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
8f70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
8f80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
8f90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
8fa0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
8fb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
8fc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
8fd0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
8fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
9000: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
9010: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
9020: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9030: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
9040: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9050: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
9060: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
9070: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
9080: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
9090: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
90a0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
90b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
90c0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
90d0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
90e0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
90f0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9120: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
9130: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
9140: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
9150: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9160: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
9170: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
9180: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
91a0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
91b0: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
91c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
91d0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
91e0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
91f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9200: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
9210: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
9220: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
9230: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
9240: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9250: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
9260: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
9270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9280: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
9290: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
92a0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
92b0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
92c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
92d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
92e0: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
92f0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
9300: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
9310: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
9320: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
9330: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
9340: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
9350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9360: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
9370: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
9380: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9390: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
93a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
93b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
93c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
93d0: 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20 20  zeroHdr[28];..  
93e0: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
93f0: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
9400: 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  )).  rc = sqlite
9410: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9420: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
9430: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
9440: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
9450: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
9460: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
9470: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
9480: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
9490: 4e 4c 59 20 7c 20 70 50 61 67 65 72 2d 3e 73 79  NLY | pPager->sy
94a0: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
94b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
94c0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
94d0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
94e0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
94f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
9500: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
9510: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
9520: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
9530: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
9540: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
9550: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
9560: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
9570: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
9580: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9590: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
95a0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
95b0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
95c0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
95d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
95e0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
95f0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
9600: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
9610: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
9620: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
9630: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
9640: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
9650: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
9660: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
9670: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
9680: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
9690: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
96a0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
96b0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
96c0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
96d0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
96e0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
96f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9700: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
9710: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
9720: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
9730: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
9740: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
9750: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
9760: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
9770: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
9780: 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20  ;.  int nHeader 
9790: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
97a0: 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65  ze;.  int nWrite
97b0: 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  ;..  if( nHeader
97c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
97d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
97e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
97f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
9800: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
9810: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
9820: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
9830: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
9840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9850: 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75  ;.  }..  seekJou
9860: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
9870: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9880: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
9890: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d  journalOff;..  m
98a0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
98b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
98c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
98d0: 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ic));..  /* .  *
98e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
98f0: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
9900: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
9910: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
9920: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
9930: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
9940: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
9950: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
9960: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
9970: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
9980: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
9990: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
99a0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
99b0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
99c0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
99d0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
99e0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
99f0: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
9a00: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
9a10: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
9a20: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
9a30: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
9a40: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
9a50: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
9a60: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
9a70: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
9a80: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
9a90: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
9aa0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
9ab0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
9ac0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
9ad0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9ae0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9af0: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
9b00: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
9b10: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
9b20: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20  failure occured 
9b30: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
9b40: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9b50: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
9b60: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
9b70: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
9b80: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
9b90: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
9ba0: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
9bb0: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
9bc0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
9bd0: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
9be0: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
9bf0: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
9c00: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
9c10: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
9c20: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
9c30: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
9c40: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
9c50: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
9c60: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
9c70: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
9c80: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
9c90: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
9ca0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
9cb0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
9cc0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
9cd0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
9ce0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a  Pager->noSync);.
9cf0: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e    if( (pPager->n
9d00: 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73  oSync) .   || (s
9d10: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
9d20: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
9d30: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
9d40: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
9d50: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
9d60: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9d70: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9d80: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
9d90: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
9da0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
9db0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9dc0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
9dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
9de0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
9df0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
9e00: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
9e10: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
9e20: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9e30: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
9e40: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
9e50: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9e60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9e70: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
9e80: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
9e90: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
9ea0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
9eb0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9ec0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9ed0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
9ee0: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
9ef0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
9f00: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
9f10: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
9f20: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9f30: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9f40: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
9f50: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
9f60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9f70: 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b  journalHdr==0 ){
9f80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
9f90: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74   size */.    put
9fa0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9fb0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9fc0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
9fd0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9fe0: 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  }..  for(nWrite=
9ff0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
a000: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
a010: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
a020: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
a030: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
a040: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
a050: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
a060: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
a070: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
a080: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
a090: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
a0a0: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
a0b0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
a0c0: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
a0d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a0e0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
a0f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a100: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
a110: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
a120: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
a130: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
a140: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
a150: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
a160: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
a170: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
a180: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
a190: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
a1a0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
a1b0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
a1c0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
a1d0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
a1e0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
a1f0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
a200: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
a210: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
a220: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
a230: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
a240: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
a250: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
a260: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
a270: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
a280: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
a290: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
a2a0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a2b0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a2c0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a2d0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a2e0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a2f0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a300: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a310: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a320: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a330: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a340: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a350: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a360: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a370: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a380: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a390: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a3a0: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a3b0: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a3c0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a3d0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a3e0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a3f0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a400: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a410: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a420: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a430: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a440: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a450: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a460: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a470: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a480: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a490: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a4a0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a4b0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a4c0: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a4d0: 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69  f;.  int iPageSi
a4e0: 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e  ze;..  seekJourn
a4f0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
a500: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
a510: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
a520: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
a530: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
a540: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a550: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72  E_DONE;.  }.  jr
a560: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
a570: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72  journalOff;..  r
a580: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a590: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
a5a0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
a5b0: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
a5c0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a5d0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
a5e0: 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69   += sizeof(aMagi
a5f0: 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  c);..  if( memcm
a600: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
a610: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
a620: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
a630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a640: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
a650: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a660: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
a670: 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66  ff, pNRec);.  if
a680: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a690: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a6a0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a6b0: 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50  , jrnlOff+4, &pP
a6c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
a6d0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a6e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
a6f0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a700: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
a710: 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  8, pDbSize);.  i
a720: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a730: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a740: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a750: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28  d, jrnlOff+16, (
a760: 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65  u32 *)&iPageSize
a770: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
a780: 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50  ITE_OK .   && iP
a790: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20  ageSize>=512 .  
a7a0: 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53   && iPageSize<=S
a7b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a7c0: 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50 61  IZE .   && ((iPa
a7d0: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
a7e0: 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ize)==0 .  ){.  
a7f0: 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d    u16 pagesize =
a800: 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20   iPageSize;.    
a810: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a820: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
a830: 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b  ger, &pagesize);
a840: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
a850: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
a860: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
a870: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
a880: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a890: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
a8a0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a8b0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a8c0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a8d0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
a8e0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a8f0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
a900: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
a910: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
a920: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
a930: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
a940: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
a950: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
a960: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a970: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a980: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a990: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a9a0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
a9b0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a9c0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
a9d0: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
a9e0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
a9f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
aa00: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
aa10: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
aa20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
aa30: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
aa40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
aa50: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
aa60: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
aa70: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
aa80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
aa90: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
aaa0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
aab0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
aac0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aad0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
aae0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
aaf0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
ab00: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
ab10: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
ab20: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
ab30: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
ab40: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
ab50: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
ab60: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
ab70: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
ab80: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
ab90: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
aba0: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
abb0: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
abc0: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
abd0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
abe0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
abf0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
ac00: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
ac10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ac20: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
ac30: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
ac40: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
ac50: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
ac60: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
ac70: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
ac80: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
ac90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
aca0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
acb0: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
acc0: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
acd0: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
ace0: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
acf0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
ad00: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
ad10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ad20: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
ad30: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
ad40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
ad50: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
ad60: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
ad70: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
ad80: 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75  lOff;.  u32 cksu
ad90: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
ada0: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
adb0: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
adc0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
add0: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
ade0: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
adf0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
ae00: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
ae10: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
ae20: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
ae30: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
ae40: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
ae50: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
ae60: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
ae70: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
ae80: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
ae90: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
aea0: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
aeb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aec0: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
aed0: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
aee0: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
aef0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
af00: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
af10: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
af20: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
af30: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
af40: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
af50: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
af60: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
af70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
af80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
af90: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
afa0: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
afb0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
afc0: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
afd0: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
afe0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
aff0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b000: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
b010: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
b020: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b030: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
b040: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
b050: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b060: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b070: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
b080: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
b090: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
b0a0: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
b0b0: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
b0c0: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
b0d0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
b0e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
b0f0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
b100: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b110: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
b120: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b130: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
b140: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b150: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
b160: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
b170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
b180: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
b190: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
b1a0: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
b1b0: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
b1c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
b1d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
b1e0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
b1f0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
b200: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
b210: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
b220: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
b230: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
b240: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
b250: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
b260: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
b270: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
b280: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
b290: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
b2a0: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
b2b0: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
b2c0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
b2d0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
b2e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b2f0: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
b300: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
b310: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b320: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b330: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
b340: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
b350: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
b360: 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29   assert( MEMDB )
b370: 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e  ;.  if( !pHist->
b380: 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  inStmt ){.    as
b390: 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72  sert( pHist->pPr
b3a0: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69  evStmt==0 && pHi
b3b0: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  st->pNextStmt==0
b3c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
b3d0: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
b3e0: 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54     PGHDR_TO_HIST
b3f0: 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20  (pPager->pStmt, 
b400: 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74  pPager)->pPrevSt
b410: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  mt = pPg;.    }.
b420: 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74      pHist->pNext
b430: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
b440: 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Stmt;.    pPager
b450: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
b460: 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
b470: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
b480: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
b490: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
b4a0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
b4b0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
b4c0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
b4d0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
b4e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
b4f0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
b500: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
b510: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
b520: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
b530: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
b540: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
b550: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
b560: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
b570: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
b580: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
b590: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
b5a0: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
b5b0: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
b5c0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b5d0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
b5e0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
b5f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b600: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
b610: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
b620: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
b630: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
b640: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
b650: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
b660: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
b670: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
b680: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
b690: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
b6a0: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
b6b0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
b6c0: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
b6d0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
b6e0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
b6f0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
b700: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
b710: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
b720: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
b730: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
b740: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
b750: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50  .    IOTRACE(("P
b760: 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
b770: 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
b780: 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  o));.    PAGER_I
b790: 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
b7a0: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
b7b0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
b7c0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b7d0: 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
b7e0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
b7f0: 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  free(pPg->pData)
b800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b810: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61  ee(pPg);.  }.  a
b820: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72  ssert(pPager->lr
b830: 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20  u.pFirst==0);.  
b840: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b850: 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
b860: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b870: 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d  ager->lru.pLast=
b880: 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  =0);.  pPager->p
b890: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
b8a0: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
b8b0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
b8c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48   0;.  pPager->nH
b8d0: 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ash = 0;.  sqlit
b8e0: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
b8f0: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
b900: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
b910: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30  Pager->aHash = 0
b920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
b930: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
b940: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b950: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
b960: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
b970: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
b980: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
b990: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
b9a0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
b9b0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
b9c0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
b9d0: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
b9e0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
b9f0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
ba00: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
ba10: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
ba20: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
ba30: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
ba40: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
ba50: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
ba60: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
ba70: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
ba80: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
ba90: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
baa0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
bab0: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
bac0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
bad0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bae0: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  eMode ){.    if(
baf0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
bb00: 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f   int rc = osUnlo
bb10: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
bb20: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  O_LOCK);.      i
bb30: 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d 3e  f( rc ) pPager->
bb40: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
bb50: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
bb60: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
bb70: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
bb80: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
bb90: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
bba0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
bbb0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
bbc0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
bbd0: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  se lock..      *
bbe0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
bbf0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
bc00: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
bc10: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
bc20: 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74       ** delete t
bc30: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
bc40: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 20   under us..     
bc50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
bc60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bc70: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
bc80: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
bc90: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
bca0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bcb0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
bcc0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
bcd0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
bce0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
bcf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
bd00: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
bd10: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
bd20: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
bd30: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
bd40: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
bd50: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
bd60: 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74  e.      ** trust
bd70: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
bd80: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
bd90: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
bda0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
bdb0: 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20     ** cache can 
bdc0: 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64  be discarded and
bdd0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
bde0: 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a  safely cleared..
bdf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
be00: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
be10: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  de ){.        if
be20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
be30: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
be40: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
be50: 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
be60: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
be70: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
be80: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
be90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
bea0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
beb0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
bec0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
bed0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  oy(pPager->pInSt
bee0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
bef0: 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d  Pager->pInStmt =
bf00: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
bf10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
bf20: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  mtOpen = 0;.    
bf30: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
bf40: 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20  InUse = 0;.     
bf50: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
bf60: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
bf70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
bf80: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
bf90: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
bfa0: 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
bfb0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bfc0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
bfd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bfe0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c      if( !MEMDB |
bff0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
c000: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
c010: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
c020: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
c030: 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  CK;.      pPager
c040: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c050: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
c060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
c070: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
c080: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
c090: 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
c0a0: 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
c0b0: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
c0c0: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
c0d0: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
c0e0: 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20  rror state, .** 
c0f0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
c100: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he rollback..*/.
c110: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c120: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
c130: 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ck(Pager *p){.  
c140: 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74  /* assert( p->st
c150: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
c160: 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61  VED || p->journa
c170: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a 20  lOpen==0 ); */. 
c180: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d   if( p->errCode=
c190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
c1a0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
c1b0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
c1c0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
c1d0: 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67  ck(p);.  }.  pag
c1e0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 23 69  er_unlock(p);.#i
c1f0: 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f 0.  assert( p-
c200: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
c210: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28  journalOpen || (
c220: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
c230: 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  &&!p->journalOff
c240: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
c250: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
c260: 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e  >stmtOpen || p->
c270: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b  exclusiveMode );
c280: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
c290: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
c2a0: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
c2b0: 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
c2c0: 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74   is ended by eit
c2d0: 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20  her.** a COMMIT 
c2e0: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  or a ROLLBACK..*
c2f0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
c300: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c310: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
c320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c330: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
c340: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c350: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
c360: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
c370: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
c380: 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74  lease.** the dat
c390: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
c3a0: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
c3b0: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
c3c0: 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a  ce if that is.**
c3d0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
c3e0: 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52   thing to do.  R
c3f0: 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75  elease locks usu
c400: 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69  ally is appropri
c410: 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77  ate,.** unless w
c420: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
c430: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f  ve access mode o
c440: 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73  r unless this is
c450: 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e   a .** COMMIT AN
c460: 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42  D BEGIN or ROLLB
c470: 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70  ACK AND BEGIN op
c480: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  eration..**.** T
c490: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c4a0: 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65  is either delete
c4b0: 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a  d or truncated..
c4c0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
c4d0: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
c4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
c4f0: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
c500: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
c510: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
c520: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
c530: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
c540: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
c550: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
c560: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
c570: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
c580: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c590: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c5a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
c5b0: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
c5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c5d0: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
c5e0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c5f0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
c600: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
c610: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
c620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c630: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
c640: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
c650: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
c660: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
c670: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
c680: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
c690: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c6a0: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
c6b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
c6c0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
c6d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c6e0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
c6f0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 65 78   if( (pPager->ex
c700: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 0a 20  clusiveMode ||. 
c710: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c720: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
c730: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
c740: 45 52 53 49 53 54 29 20 0a 20 20 20 20 20 20 20  ERSIST) .       
c750: 26 26 20 28 72 63 20 3d 20 7a 65 72 6f 4a 6f 75  && (rc = zeroJou
c760: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 29  rnalHdr(pPager))
c770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c780: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c790: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
c7a0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c7b0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
c7c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7d0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c7e0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c7f0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c800: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
c810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c820: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
c830: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
c840: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
c850: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
c860: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
c870: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c880: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
c890: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c8a0: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
c8b0: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
c8c0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
c8d0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
c8e0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
c8f0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
c900: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c910: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
c920: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
c930: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
c940: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
c950: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
c960: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c970: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
c980: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c990: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
c9a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
c9b0: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
c9c0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c9d0: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
c9e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
c9f0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
ca00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ca10: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
ca20: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
ca30: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ca40: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
ca50: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
ca60: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
ca70: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
ca80: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ca90: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
caa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
cab0: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
cac0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
cad0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
cae0: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
caf0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
cb00: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
cb10: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
cb20: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cb30: 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73  nc = 0;.  lruLis
cb40: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
cb50: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
cb60: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
cb70: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
cb80: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
cb90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
cba0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
cbb0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
cbc0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
cbd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
cbe0: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
cbf0: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
cc00: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
cc10: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
cc20: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
cc30: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
cc40: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
cc50: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
cc60: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
cc70: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
cc80: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
cc90: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
cca0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
ccb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
ccc0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
ccd0: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
cce0: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
ccf0: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
cd00: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
cd10: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
cd20: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
cd30: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
cd40: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
cd50: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
cd60: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
cd70: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
cd80: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
cd90: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
cda0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
cdb0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
cdc0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
cdd0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
cde0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
cdf0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
ce00: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
ce10: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
ce20: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
ce30: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
ce40: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
ce50: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
ce60: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
ce70: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
ce80: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
ce90: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
cea0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
ceb0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
cec0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
ced0: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
cee0: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
cef0: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
cf00: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
cf10: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
cf20: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
cf30: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
cf40: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
cf50: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
cf60: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
cf70: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
cf80: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
cf90: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
cfa0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
cfb0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
cfc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
cfd0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
cfe0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
cff0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
d000: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
d010: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
d020: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
d030: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
d040: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
d050: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
d060: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
d070: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
d080: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
d090: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
d0a0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
d0b0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d0c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
d0d0: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
d0e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
d0f0: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
d100: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
d110: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
d120: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
d130: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
d140: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
d150: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
d160: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
d170: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d180: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
d190: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
d1a0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
d1b0: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
d1c0: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
d1d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
d1e0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
d1f0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
d200: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
d210: 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66   *jfd,.  i64 off
d220: 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b  set,.  int useCk
d230: 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sum.){.  int rc;
d240: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
d270: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
d280: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
d290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d2a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
d2b0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
d2c0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
d2d0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
d300: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
d310: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
d320: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
d330: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
d340: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
d350: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
d360: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
d370: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
d380: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
d390: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
d3a0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
d3b0: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
d3c0: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
d3d0: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
d3e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
d3f0: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
d400: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
d410: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
d420: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
d430: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
d440: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
d450: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
d460: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d470: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
d480: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d490: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
d4a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
d4b0: 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72  fset+4);.  if( r
d4c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d4d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
d4e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
d4f0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
d500: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
d510: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
d520: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
d530: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
d540: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
d550: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
d560: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
d570: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
d580: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
d590: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
d5a0: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
d5b0: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
d5c0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
d5d0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
d5e0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
d5f0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
d600: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
d610: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
d620: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
d630: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
d640: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
d650: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
d660: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
d670: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d680: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
d690: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
d6a0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
d6b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d6c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
d6d0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
d6e0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
d6f0: 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e   offset+pPager->
d700: 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
d710: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
d720: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d730: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d740: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
d750: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
d760: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
d770: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
d780: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
d7a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d7b0: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
d7c0: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
d7d0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
d7e0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
d7f0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d800: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
d810: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
d820: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
d830: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
d840: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d850: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
d860: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
d870: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
d880: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
d890: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
d8a0: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
d8b0: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
d8c0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
d8d0: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
d8e0: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
d8f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
d900: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d910: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
d920: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
d930: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
d940: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
d950: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
d960: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
d970: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
d980: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
d990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d9a0: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
d9b0: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
d9c0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
d9d0: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
d9e0: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
d9f0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
da00: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
da10: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
da20: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
da30: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
da40: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
da50: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
da60: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
da70: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
da80: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
da90: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
daa0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
dab0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
dac0: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
dad0: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
dae0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
daf0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
db00: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
db10: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
db20: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
db30: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
db40: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
db50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
db60: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
db70: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
db80: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
db90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
dba0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
dbb0: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
dbc0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
dbd0: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
dbe0: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
dbf0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
dc00: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
dc10: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
dc20: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
dc30: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
dc40: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
dc50: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
dc60: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
dc70: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
dc80: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
dc90: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
dca0: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
dcb0: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
dcc0: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
dcd0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
dce0: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
dcf0: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
dd00: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
dd10: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
dd20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
dd30: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
dd40: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
dd50: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
dd60: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
dd70: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
dd80: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
dd90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
dda0: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
ddb0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
ddc0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
ddd0: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
dde0: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
ddf0: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
de00: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
de10: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
de20: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
de30: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
de40: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
de50: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
de60: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
de70: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
de80: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
de90: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
dea0: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
deb0: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
dec0: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
ded0: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
dee0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
def0: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
df00: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
df10: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
df20: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
df30: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
df40: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
df50: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
df60: 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52  pgno);.  PAGERTR
df70: 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE4("PLAYBACK %
df80: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
df90: 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
dfa0: 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
dfb0: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
dfc0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
dfd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
dfe0: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70  aData));.  if( p
dff0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e000: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
e010: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
e020: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20 20  >needSync==0).  
e030: 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
e040: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
e050: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
e060: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
e070: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e080: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e090: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e0a0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
e0b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
e0c0: 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
e0d0: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
e0e0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
e0f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
e100: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
e110: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
e120: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
e130: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
e140: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
e150: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
e160: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
e170: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
e180: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
e190: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
e1a0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
e1b0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
e1c0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
e1d0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
e1e0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
e1f0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
e200: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
e210: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
e220: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
e230: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
e240: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
e250: 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61  *pData;.    /* a
e260: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
e270: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
e280: 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44  ==1 ); */.    pD
e290: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
e2a0: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
e2b0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
e2c0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
e2d0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
e2e0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
e2f0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e300: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20  >xReiniter(pPg, 
e310: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e320: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
e330: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
e340: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
e350: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
e360: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
e370: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
e380: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
e390: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
e3a0: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
e3b0: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
e3c0: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
e3d0: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
e3e0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
e3f0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
e400: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
e410: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
e420: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
e430: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
e440: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
e450: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
e460: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
e470: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
e480: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
e490: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
e4a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e4b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
e4c0: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
e4d0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
e4e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e4f0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
e500: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
e510: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
e520: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e530: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
e540: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
e550: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
e560: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
e570: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
e580: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e590: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
e5a0: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
e5b0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
e5c0: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
e5d0: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
e5e0: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
e5f0: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
e600: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
e610: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
e620: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e630: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
e640: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
e650: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
e660: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
e670: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
e680: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
e690: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
e6a0: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
e6b0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
e6c0: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
e6d0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
e6e0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
e6f0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
e700: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
e710: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
e720: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
e730: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
e740: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
e750: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
e760: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
e770: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
e780: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
e790: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e7a0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
e7b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
e7c0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
e7d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e7e0: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
e7f0: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
e800: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
e810: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
e820: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
e830: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e840: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
e850: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
e860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
e870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e880: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
e890: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e8a0: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
e8b0: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
e8c0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
e8d0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
e8e0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
e8f0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
e900: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
e910: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
e920: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
e930: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
e940: 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  _malloc(pVfs->sz
e950: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
e960: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
e970: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
e980: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
e990: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
e9a0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
e9b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e9c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
e9d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
e9e0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
e9f0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
ea00: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
ea10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
ea20: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
ea30: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
ea40: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
ea50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ea60: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
ea70: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
ea80: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
ea90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
eaa0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
eab0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
eac0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ead0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
eae0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
eaf0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
eb00: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
eb10: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
eb20: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
eb30: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
eb40: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
eb50: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
eb60: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
eb70: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
eb80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
eb90: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
eba0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
ebb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
ebc0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
ebd0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
ebe0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
ebf0: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
ec00: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
ec10: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  e3_malloc(nMaste
ec20: 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
ec30: 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20  erPtr);.    if( 
ec40: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
ec50: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ec60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ec70: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ec80: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
ec90: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
eca0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
ecb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20  sterJournal];.  
ecc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ecd0: 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
ece0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
ecf0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
ed00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ed10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
ed20: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
ed30: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
ed40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
ed50: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
ed60: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
ed70: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
ed80: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
ed90: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
eda0: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
edb0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
edc0: 49 53 54 53 29 3b 0a 20 20 20 20 20 20 69 66 28  ISTS);.      if(
edd0: 20 72 63 21 3d 30 20 26 26 20 72 63 21 3d 31 20   rc!=0 && rc!=1 
ede0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
edf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ee00: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
ee10: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
ee20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ee30: 28 20 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc==1 ){.     
ee40: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
ee50: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
ee60: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
ee70: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
ee80: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
ee90: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
eea0: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
eeb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
eec0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
eed0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
eee0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
eef0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ef00: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
ef10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
ef20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
ef30: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
ef40: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
ef50: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
ef60: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
ef70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
ef80: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
ef90: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
efa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
efb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
efc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
efd0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
efe0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
eff0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
f000: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
f010: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
f020: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
f030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
f040: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
f050: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
f060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f070: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
f080: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
f090: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
f0a0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
f0b0: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
f0c0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
f0d0: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
f0e0: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
f0f0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
f100: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
f110: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
f120: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
f130: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
f140: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f160: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
f170: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
f180: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
f190: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
f1a0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
f1b0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
f1c0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
f1d0: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
f1e0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
f1f0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
f200: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
f210: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
f220: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
f230: 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
f240: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
f250: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
f260: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
f270: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
f280: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
f290: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a  ager *pPager);..
f2a0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
f2b0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
f2c0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
f2d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f2e0: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
f2f0: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
f300: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
f310: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
f320: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
f330: 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  Might might be t
f340: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
f350: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
f360: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50   smaller than nP
f370: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  age..** This can
f380: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
f390: 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20  mple, if we are 
f3a0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
f3b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
f3c0: 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65  * which has exte
f3d0: 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69  nded the file si
f3e0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70  ze and the new p
f3f0: 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61  ages are still a
f400: 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61  ll held.** in ca
f410: 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53  che, then an INS
f420: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f  ERT or UPDATE do
f430: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  es a statement r
f440: 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a  ollback.  Some.*
f450: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
f460: 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
f470: 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
f480: 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74  sed if you try t
f490: 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20  o.** truncate a 
f4a0: 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
f4b0: 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
f4c0: 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74   than it current
f4d0: 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74  ly is,.** so det
f4e0: 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
f4f0: 64 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20  d do not do the 
f500: 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  truncation..*/.s
f510: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
f520: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
f530: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
f540: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
f550: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
f560: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
f570: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
f580: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
f590: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
f5a0: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
f5b0: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
f5c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
f5d0: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
f5e0: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
f5f0: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
f600: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
f610: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
f620: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f630: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  & currentSize>ne
f640: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  wSize ){.      r
f650: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
f660: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
f670: 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
f680: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
f690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f6a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f6b0: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
f6c0: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
f6d0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
f6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f6f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
f700: 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20  torSize for the 
f710: 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a  given pager..**.
f720: 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  ** The sector si
f730: 7a 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 61  ze is at least a
f740: 73 20 62 69 67 20 61 73 20 74 68 65 20 73 65 63  s big as the sec
f750: 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65  tor size reporte
f760: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f  d.** by sqlite3O
f770: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 20  sSectorSize().  
f780: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74  The minimum sect
f790: 6f 72 20 73 69 7a 65 20 69 73 20 35 31 32 2e 0a  or size is 512..
f7a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f7b0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
f7c0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
f7d0: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
f7e0: 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
f7f0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
f800: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f810: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
f820: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
f830: 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
f840: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
f850: 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
f860: 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
f870: 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
f880: 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61  yet, in whcih ca
f890: 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
f8a0: 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
f8b0: 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
f8c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
f8d0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
f8e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
f8f0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
f900: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
f910: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35  er->sectorSize<5
f920: 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  12 ){.    pPager
f930: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
f940: 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  12;.  }.}../*.**
f950: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
f960: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
f970: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
f980: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
f990: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
f9a0: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
f9b0: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
f9c0: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
f9d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f9e0: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
f9f0: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
fa00: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
fa10: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
fa20: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
fa30: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
fa40: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
fa50: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
fa60: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
fa70: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
fa80: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
fa90: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
faa0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
fab0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
fac0: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
fad0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
fae0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
faf0: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
fb00: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
fb10: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
fb20: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
fb30: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
fb40: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
fb50: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
fb60: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
fb70: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
fb80: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
fb90: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
fba0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
fbb0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
fbc0: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
fbd0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
fbe0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
fbf0: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
fc00: 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
fc10: 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
fc20: 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
fc30: 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
fc40: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
fc50: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
fc60: 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
fc70: 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
fc80: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
fc90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
fca0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
fcb0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
fcc0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
fcd0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
fce0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
fcf0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
fd00: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
fd10: 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
fd20: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
fd30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
fd40: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
fd50: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
fd60: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
fd70: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
fd80: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
fd90: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
fda0: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
fdb0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
fdc0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
fdd0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
fde0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
fdf0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
fe00: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
fe10: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
fe20: 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
fe30: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
fe40: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
fe50: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
fe60: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
fe70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
fe80: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
fe90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
fea0: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
feb0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
fec0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
fed0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
fee0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fef0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
ff00: 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
ff10: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
ff20: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
ff30: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
ff40: 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
ff50: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
ff60: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
ff70: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
ff80: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
ff90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
ffa0: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
ffb0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
ffc0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
ffd0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
ffe0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
fff0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
10000 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
10010 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
10020 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
10030 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
10040 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
10050 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
10060 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
10070 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
10080 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
10090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
100a0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
100b0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
100c0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
100d0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
100e0 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
100f0 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
10100 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
10110 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
10120 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
10130 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
10140 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
10150 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
10160 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
10170 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
10180 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
10190 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
101a0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
101b0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
101c0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
101d0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
101e0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
101f0 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
10200 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
10210 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
10220 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
10230 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
10240 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
10250 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
10260 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
10270 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
10280 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
10290 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
102a0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
102b0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
102c0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
102d0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
102e0 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
102f0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
10300 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
10310 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
10320 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
10330 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
10340 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
10350 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
10360 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
10370 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
10380 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
10390 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
103a0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
103b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
103c0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
103d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
103e0 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
103f0 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
10400 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
10410 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
10420 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
10430 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
10440 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
10450 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
10460 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
10470 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
10480 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
10490 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
104a0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
104b0 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
104c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
104d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
104e0 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10500 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
10510 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
10520 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
10530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
10550 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
10560 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10590 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
105a0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
105b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
105c0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
105d0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
105e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
105f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
10600 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
10610 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
10620 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10630 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
10640 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
10650 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
10660 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
10670 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10680 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10690 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
106a0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
106b0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
106c0 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
106d0 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
106e0 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
106f0 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
10700 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10710 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10720 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
10730 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10740 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
10750 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
10760 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
10770 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
10780 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
10790 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
107a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
107b0 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
107c0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
107d0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
10800 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
10810 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
10820 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
10830 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
10840 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
10850 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
10860 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
10870 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a  d back..  */.  z
10880 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
10890 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
108a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
108b0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
108c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
108d0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
108e0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
108f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
10900 7a 4d 61 73 74 65 72 5b 30 5d 20 0a 20 20 20 26  zMaster[0] .   &
10910 26 20 28 72 65 73 3d 73 71 6c 69 74 65 33 4f 73  & (res=sqlite3Os
10920 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
10930 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
10940 45 53 53 5f 45 58 49 53 54 53 29 29 3d 3d 30 20  ESS_EXISTS))==0 
10950 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73  ) .  ){.    zMas
10960 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  ter = 0;.    got
10970 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10980 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
10990 30 3b 0a 20 20 69 66 28 20 72 65 73 3c 30 20 29  0;.  if( res<0 )
109a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
109b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
109c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
109d0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
109e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
109f0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
10a00 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
10a10 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
10a20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
10a30 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
10a40 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
10a50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
10a60 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
10a70 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
10a80 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
10a90 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
10aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10ab0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
10ac0 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
10ad0 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
10ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10af0 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
10b00 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
10b10 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
10b20 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
10b30 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
10b40 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
10b50 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
10b60 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
10b70 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
10b80 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
10b90 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
10ba0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
10bb0 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
10bc0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
10bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10be0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
10bf0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
10c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
10c10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
10c20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
10c30 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
10c40 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
10c50 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
10c60 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
10c70 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
10c80 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
10c90 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
10ca0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
10cb0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
10cc0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
10cd0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
10ce0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
10cf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
10d00 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
10d10 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
10d20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10d30 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
10d40 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
10d50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
10d60 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
10d70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10d80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10d90 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
10da0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
10db0 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
10dc0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
10dd0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
10de0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
10df0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10e00 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
10e10 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
10e20 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10e30 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
10e40 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
10e50 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
10e60 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
10e70 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
10e80 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
10e90 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
10ea0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
10eb0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
10ec0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
10ed0 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
10ee0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
10ef0 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
10f00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
10f10 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
10f20 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
10f30 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
10f40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
10f50 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
10f60 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
10f70 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
10f80 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  2565..    */.   
10f90 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
10fa0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
10fb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10fc0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
10fd0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
10fe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10ff0 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
11000 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
11010 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
11020 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
11030 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
11040 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
11050 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
11060 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
11070 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
11080 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
11090 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
110a0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
110b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
110c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
110d0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
110e0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
110f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11100 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11110 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
11120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11130 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11140 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11160 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
11170 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
11180 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
11190 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
111a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
111b0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
111c0 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
111d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
111e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
111f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11200 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11210 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
11220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11250 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
11260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11270 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
11280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11290 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
112a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
112b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
112c0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
112d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
112e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
112f0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
11300 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
11310 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
11320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11330 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
11340 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
11350 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
11360 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11370 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
11380 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
11390 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
113a0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
113b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
113c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
113d0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
113e0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
113f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11400 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
11410 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
11420 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
11430 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
11440 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
11450 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
11460 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
11470 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
11480 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11490 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
114a0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
114b0 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
114c0 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
114d0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
114e0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
114f0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
11500 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
11510 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
11520 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
11530 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
11540 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
11550 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
11560 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
11570 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
11580 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
11590 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
115a0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
115b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
115c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
115d0 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
115e0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
115f0 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
11600 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
11610 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11620 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
11630 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
11640 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
11650 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
11660 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
11670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11680 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11690 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
116a0 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
116b0 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
116c0 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
116d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
116e0 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
116f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
11700 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
11710 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
11720 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11730 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
11740 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
11750 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
11760 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11770 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
11780 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
11790 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
117a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
117b0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
117c0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
117d0 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
11800 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
11810 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
11820 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
11830 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11840 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
11850 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11870 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11880 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
11890 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
118a0 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68  Off;..  /* Set h
118b0 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
118c0 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65  offset just afte
118d0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
118e0 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   last journal.  
118f0 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ** page written 
11900 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
11910 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
11920 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
11930 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
11940 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c  ion was written,
11950 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
11960 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
11970 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
11980 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
11990 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
119a0 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
119b0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
119c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
119d0 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
119e0 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
119f0 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
11a00 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
11a10 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
11a20 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
11a30 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
11a40 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
11a50 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
11a60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
11a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11a80 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11a90 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
11aa0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
11ab0 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
11ac0 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
11ad0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
11ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11af0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
11b00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11b10 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  en );.  nRec = p
11b20 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
11b30 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
11b40 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
11b50 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
11b60 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
11b70 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
11b80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11b90 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
11ba0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11bb0 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
11bc0 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
11bd0 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
11be0 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
11bf0 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
11c00 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
11c10 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
11c20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11c30 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
11c40 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
11c50 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
11c60 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
11c70 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11c80 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11c90 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f   pPager->stfd, o
11ca0 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61  ffset, 0);.    a
11cb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11cc0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
11cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ce0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
11cf0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
11d00 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
11d10 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
11d20 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
11d30 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
11d40 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
11d50 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
11d60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11d70 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
11d80 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
11d90 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
11da0 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
11db0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
11dc0 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
11dd0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
11de0 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
11df0 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
11e00 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
11e10 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
11e20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
11e30 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
11e40 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
11e50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
11e60 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
11e70 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
11e80 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
11e90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
11ea0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
11eb0 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
11ec0 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
11ed0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
11ee0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
11ef0 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
11f00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11f10 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
11f20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
11f30 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
11f40 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
11f50 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
11f60 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61  alOff, 1);.    a
11f70 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11f80 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
11f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11fa0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
11fb0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
11fc0 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
11fd0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
11fe0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
11ff0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
12000 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
12010 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
12020 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
12030 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
12040 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
12050 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
12060 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
12080 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12090 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
120a0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
120b0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
120c0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
120d0 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
120e0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
120f0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
12100 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
12110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
12120 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
12130 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
12140 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
12150 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
12160 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
12170 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
12180 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
121a0 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
121b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
121c0 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
121d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
121e0 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
121f0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
12200 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12210 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
12220 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
12230 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
12240 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
12250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12260 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
12270 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
12280 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
12290 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
122a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
122b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
122c0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
122d0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
122e0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
122f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
12300 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
12310 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
12320 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
12330 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
12340 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
12350 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
12360 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
12370 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
12380 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
12390 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
123a0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
123b0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
123c0 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
123d0 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
123e0 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
123f0 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
12400 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
12410 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
12420 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
12430 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
12440 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
12450 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
12460 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
12470 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
12480 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
12490 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
124a0 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
124b0 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
124c0 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
124d0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
124e0 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
124f0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
12500 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12510 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
12520 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
12530 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
12540 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
12550 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
12560 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
12570 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
12580 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
12590 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
125a0 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
125b0 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
125c0 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
125d0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
125e0 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
125f0 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
12600 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12610 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
12620 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
12630 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
12640 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
12650 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
12660 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
12670 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
12680 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
12690 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
126a0 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
126b0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
126c0 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
126d0 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
126e0 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
126f0 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
12700 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
12710 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
12720 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
12730 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
12740 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
12750 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
12760 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
12770 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
12780 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
12790 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
127a0 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
127b0 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
127c0 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
127d0 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
127e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
127f0 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
12800 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
12810 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
12820 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12830 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
12840 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12850 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
12860 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
12870 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
12880 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12890 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
128a0 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
128b0 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
128c0 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
128d0 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
128e0 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
128f0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
12900 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
12910 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
12920 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
12930 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
12940 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
12950 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
12960 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
12970 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54  full_fsync?SQLIT
12980 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
12990 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
129a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
129b0 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
129c0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
129d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
129e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
129f0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
12a00 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
12a10 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
12a20 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
12a30 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
12a40 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
12a50 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
12a60 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
12a70 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
12a80 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
12a90 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
12aa0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
12ab0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
12ac0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
12ad0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a  emporary file. .
12ae0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
12af0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12b00 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
12b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
12b20 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
12b30 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
12b40 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
12b50 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
12b60 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
12b70 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  the temporary.**
12b80 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
12b90 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
12ba0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
12bb0 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73  gerOpentemp(.  s
12bc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12bd0 2c 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  ,    /* The virt
12be0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
12bf0 6c 61 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  layer */.  sqlit
12c00 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
12c10 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
12c20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
12c30 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  re */.  char *zF
12c40 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
12c50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
12c60 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  e.  Might be NUL
12c70 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  L */.  int vfsFl
12c80 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
12c90 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
12ca0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
12cb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12cc0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
12cd0 61 6d 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65  ame!=0 );..#ifde
12ce0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
12cf0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
12d00 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
12d10 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
12d20 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
12d30 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
12d40 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
12d50 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12d60 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
12d70 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
12d80 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
12d90 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
12da0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
12db0 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
12dc0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12dd0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69  , zFilename, pFi
12de0 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
12df0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
12e00 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69  SQLITE_OK || pFi
12e10 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  le->pMethods );.
12e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12e30 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12e40 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
12e50 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
12e60 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
12e70 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
12e80 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
12e90 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
12ea0 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
12eb0 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
12ec0 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
12ed0 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
12ee0 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
12ef0 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
12f00 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
12f10 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
12f20 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
12f30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
12f40 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
12f50 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
12f60 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
12f70 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
12f80 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
12f90 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
12fa0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
12fb0 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
12fc0 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
12fd0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
12fe0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
12ff0 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
13000 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
13010 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
13020 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
13030 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
13040 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
13050 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
13060 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
13070 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
13080 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
13090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
130a0 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
130b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
130c0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
130d0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
130e0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
130f0 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
13100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
13110 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
13120 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
13130 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
13140 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
13150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13160 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
13170 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
13180 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
13190 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
131a0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
131b0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
131c0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
131d0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
131e0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
131f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
13200 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
13210 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
13220 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
13230 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
13240 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
13250 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
13260 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
13270 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13280 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
13290 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
132a0 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
132b0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
132c0 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
132d0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
132e0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
132f0 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
13300 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
13310 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
13320 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72  )!=0;.  int jour
13330 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
13340 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
13350 28 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44  (pVfs);.  int nD
13360 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c  efaultPage = SQL
13370 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
13380 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
13390 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Pathname;.  int 
133a0 6e 50 61 74 68 6e 61 6d 65 3b 0a 20 20 63 68 61  nPathname;.  cha
133b0 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 0a 20 20  r *zStmtJrnl;.  
133c0 69 6e 74 20 6e 53 74 6d 74 4a 72 6e 6c 3b 0a 0a  int nStmtJrnl;..
133d0 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
133e0 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
133f0 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
13400 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
13410 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
13420 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a  ull pathname */.
13430 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
13440 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13450 3b 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ;.  zPathname = 
13460 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
13470 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 69  Pathname*2);.  i
13480 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
13490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
134a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
134b0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
134c0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
134d0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
134e0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
134f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13500 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
13510 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
13520 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
13530 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
13540 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
13550 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
13560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
13570 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
13580 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
13590 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
135a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
135b0 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
135c0 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65  te3OsGetTempname
135d0 28 70 56 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65  (pVfs, nPathname
135e0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
135f0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
13600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13610 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
13620 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13630 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68   rc;.  }.  nPath
13640 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
13650 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
13660 50 75 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Put the statemen
13670 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 65 6d  t journal in tem
13680 70 6f 72 61 72 79 20 64 69 73 6b 20 73 70 61 63  porary disk spac
13690 65 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 0a  e since this is.
136a0 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 52    ** sometimes R
136b0 41 4d 20 64 69 73 6b 20 6f 72 20 6f 74 68 65 72  AM disk or other
136c0 20 6f 70 74 69 6d 69 7a 65 64 20 73 74 6f 72 61   optimized stora
136d0 67 65 2e 20 20 55 6e 6c 69 6b 65 6c 79 20 74 68  ge.  Unlikely th
136e0 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 61 69 6e  e main.  ** main
136f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
13700 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
13710 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  rnal does not ne
13720 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 63  ed to be .  ** c
13730 6f 6c 6f 63 61 74 65 64 20 77 69 74 68 20 74 68  olocated with th
13740 65 20 64 61 74 61 62 61 73 65 20 6e 6f 72 20 64  e database nor d
13750 6f 65 73 20 69 74 20 6e 65 65 64 20 74 6f 20 62  oes it need to b
13760 65 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  e persistent..  
13770 2a 2f 0a 20 20 7a 53 74 6d 74 4a 72 6e 6c 20 3d  */.  zStmtJrnl =
13780 20 26 7a 50 61 74 68 6e 61 6d 65 5b 6e 50 61 74   &zPathname[nPat
13790 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 72 63 20 3d  hname+1];.  rc =
137a0 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
137b0 70 6e 61 6d 65 28 70 56 66 73 2c 20 70 56 66 73  pname(pVfs, pVfs
137c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 2c 20  ->mxPathname+1, 
137d0 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 20 20 69 66  zStmtJrnl);.  if
137e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13800 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13820 20 7d 0a 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 3d   }.  nStmtJrnl =
13830 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 4a 72 6e   strlen(zStmtJrn
13840 6c 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  l);..  /* Alloca
13850 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
13860 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
13870 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20  e */.  pPager = 
13880 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13890 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
138a0 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
138b0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
138c0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75  cture */.    jou
138d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
138e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
138f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
13900 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
13910 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
13920 33 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  3 +        /* Th
13930 65 20 6d 61 69 6e 20 64 62 20 61 6e 64 20 74 77  e main db and tw
13940 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
13950 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e  */ .    3*nPathn
13960 61 6d 65 20 2b 20 34 30 20 2b 20 20 20 20 20 20  ame + 40 +      
13970 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
13980 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a  , zDirectory, zJ
13990 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 6e 53  ournal */.    nS
139a0 74 6d 74 4a 72 6e 6c 20 20 20 20 20 20 20 20 20  tmtJrnl         
139b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74            /* zSt
139c0 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20  mtJrnl */.  );. 
139d0 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a   if( !pPager ){.
139e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
139f0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
13a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13a10 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72  OMEM;.  }.  pPtr
13a20 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65 72   = (u8 *)&pPager
13a30 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  [1];.  pPager->v
13a40 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
13a50 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  gs;.  pPager->fd
13a60 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
13a70 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
13a80 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61  OsFile*0];.  pPa
13a90 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c  ger->stfd = (sql
13aa0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13ab0 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13ac0 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  1];.  pPager->jf
13ad0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
13ae0 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
13af0 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50  zOsFile*2];.  pP
13b00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
13b10 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
13b20 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b  Vfs->szOsFile*2+
13b30 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
13b40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
13b50 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
13b60 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
13b70 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
13b80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
13b90 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
13ba0 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
13bb0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  .  pPager->zStmt
13bc0 4a 72 6e 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  Jrnl = &pPager->
13bd0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
13be0 6d 65 2b 31 30 5d 3b 0a 20 20 70 50 61 67 65 72  me+10];.  pPager
13bf0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
13c00 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13c10 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
13c20 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
13c30 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  1);.  memcpy(pPa
13c40 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20  ger->zStmtJrnl, 
13c50 7a 53 74 6d 74 4a 72 6e 6c 2c 20 6e 53 74 6d 74  zStmtJrnl, nStmt
13c60 4a 72 6e 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  Jrnl+1);.  sqlit
13c70 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
13c80 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  e);..  /* Open t
13c90 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
13ca0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13cb0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
13cc0 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
13cd0 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
13ce0 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
13cf0 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
13d00 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
13d10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13d20 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
13d30 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
13d40 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
13d50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13d60 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
13d70 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
13d80 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13db0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
13dc0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
13dd0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
13de0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
13df0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
13e00 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
13e10 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
13e20 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
13e30 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
13e40 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13e50 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
13e60 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
13e70 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
13e80 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
13e90 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
13ea0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
13eb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13ec0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
13ed0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
13ee0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
13ef0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13f00 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
13f10 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
13f20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
13f30 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
13f40 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
13f50 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
13f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13f80 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
13f90 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
13fa0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
13fb0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
13fc0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
13fd0 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
13fe0 61 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20  age<iSectorSize 
13ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
14000 66 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63  faultPage = iSec
14010 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
14020 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14030 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
14040 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
14050 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
14060 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
14070 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
14080 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
14090 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
140a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
140b0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
140c0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
140d0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
140e0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
140f0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
14100 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
14110 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
14120 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
14130 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
14140 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
14150 69 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b  ii=nDefaultPage;
14160 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
14170 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
14180 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
14190 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
141a0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
141b0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
141c0 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
141d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
141e0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
141f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
14200 66 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45  faultPage>SQLITE
14210 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
14220 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
14230 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65      nDefaultPage
14240 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
14250 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
14260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14270 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14280 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14290 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
142a0 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
142b0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
142c0 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
142d0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
142e0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
142f0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
14300 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
14310 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
14320 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
14330 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
14340 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
14350 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a  rite()..    */ .
14360 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
14370 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
14380 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
14390 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
143a0 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
143b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
143c0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
143d0 63 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ce = sqlite3Mall
143e0 6f 63 5a 65 72 6f 28 6e 44 65 66 61 75 6c 74 50  ocZero(nDefaultP
143f0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
14400 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14410 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
14420 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
14430 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65  e..  ** Free the
14440 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
14450 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
14460 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ile..  ** Since 
14470 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
14480 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
14490 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
144a0 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
144b0 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
144c0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
144d0 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61   !pPager || !pPa
144e0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
144f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
14500 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
14510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14520 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
14530 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c  return ((rc==SQL
14540 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e  ITE_OK)?SQLITE_N
14550 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20  OMEM:rc);.  }.. 
14560 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50   PAGERTRACE3("OP
14570 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
14580 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
14590 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
145a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54  Filename);.  IOT
145b0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
145c0 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
145d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
145e0 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  )..  /* Fill in 
145f0 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79  Pager.zDirectory
14600 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  [] */.  memcpy(p
14610 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
14620 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y, pPager->zFile
14630 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
14640 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c  1);.  for(i=strl
14650 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  en(pPager->zDire
14660 63 74 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70  ctory); i>0 && p
14670 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
14680 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
14690 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
146a0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
146b0 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20  ry[i-1] = 0;..  
146c0 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
146d0 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20  .zJournal[] */. 
146e0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
146f0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
14700 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
14710 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70  thname);.  memcp
14720 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
14730 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
14740 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a  "-journal", 9);.
14750 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
14760 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
14770 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
14780 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
14790 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
147a0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
147b0 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
147c0 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
147d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
147e0 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
147f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
14800 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
14810 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
14820 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
14830 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
14840 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
14850 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61  ize = nDefaultPa
14860 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ge;.  /* pPager-
14870 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
14880 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
14890 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
148a0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
148b0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
148c0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
148d0 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
148e0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
148f0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
14900 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
14910 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
14920 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
14930 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
14940 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
14950 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
14960 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
14970 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
14980 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
14990 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
149a0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
149b0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
149c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
149d0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
149e0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
149f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
14a00 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
14a10 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
14a20 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
14a30 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
14a40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14a50 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
14a60 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
14a70 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
14a80 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
14a90 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
14aa0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
14ab0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
14ac0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
14ad0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
14ae0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
14af0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
14b00 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
14b10 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
14b20 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
14b30 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
14b40 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
14b50 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
14b60 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14b70 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
14b80 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
14b90 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14ba0 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
14bb0 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
14bc0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  a);.  assert(pPa
14bd0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14be0 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69  s||memDb||tempFi
14bf0 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  le);.  if( !memD
14c00 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74  b ){.    setSect
14c10 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
14c20 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
14c30 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
14c40 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
14c50 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
14c60 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
14c70 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
14c80 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
14c90 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
14ca0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
14cb0 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
14cc0 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
14cd0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  0;.  pPager->iIn
14ce0 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28  UseDB = 0;.  if(
14cf0 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
14d00 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
14d10 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
14d20 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
14d30 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
14d40 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  M2);.    sqlite3
14d50 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14d60 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ex);.    pPager-
14d70 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  >pNext = sqlite3
14d80 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69  PagerList;.    i
14d90 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  f( sqlite3PagerL
14da0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ist ){.      ass
14db0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
14dc0 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20  rList->pPrev==0 
14dd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14de0 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
14df0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d   = pPager;.    }
14e00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72  .    pPager->pPr
14e10 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ev = 0;.    sqli
14e20 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70  te3PagerList = p
14e30 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
14e40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14e50 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  utex);.  }.#endi
14e60 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
14e70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
14e80 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
14e90 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
14ea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
14eb0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
14ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
14ed0 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
14ee0 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
14ef0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
14f00 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
14f10 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
14f20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
14f30 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
14f40 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
14f50 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
14f60 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
14f70 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
14f80 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
14f90 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
14fa0 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
14fb0 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
14fc0 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
14fd0 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
14fe0 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
14ff0 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
15000 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
15010 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
15020 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
15030 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
15040 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
15050 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
15060 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
15070 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
15080 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
15090 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
150a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
150b0 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
150c0 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
150d0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
150e0 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
150f0 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
15100 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
15110 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
15120 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
15130 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
15140 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
15150 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
15160 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
15170 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
15180 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
15190 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
151a0 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
151b0 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
151c0 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
151d0 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
151e0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
151f0 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
15200 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
15210 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
15220 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
15230 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
15240 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
15250 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
15260 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
15270 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
15280 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
15290 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
152a0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
152b0 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
152c0 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
152d0 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
152e0 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
152f0 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
15300 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
15310 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
15320 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
15330 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
15340 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
15350 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
15360 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
15370 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
15380 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15390 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
153a0 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
153b0 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
153c0 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
153d0 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
153e0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
153f0 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70  SIZE) );.  if( p
15400 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
15410 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
15420 65 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50  eSize .   && !pP
15430 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
15440 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a  Pager->nRef==0 .
15450 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
15460 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
15470 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67  lite3_malloc(pag
15480 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
15490 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !pNew ){.      r
154a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
154b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
154c0 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
154d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ager);.      pag
154e0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
154f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
15500 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
15510 69 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65  ize;.      setSe
15520 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
15530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15540 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  free(pPager->pTm
15550 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
15560 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
15570 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
15580 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
15590 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
155a0 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
155b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
155c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
155d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
155e0 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
155f0 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
15600 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
15610 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
15620 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
15630 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
15640 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
15650 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
15660 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
15670 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
15680 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
15690 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
156a0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
156b0 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
156c0 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
156d0 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
156e0 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
156f0 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
15700 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
15710 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
15720 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
15730 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
15740 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
15750 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
15760 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
15770 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
15780 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
15790 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
157a0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
157b0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
157c0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
157d0 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
157e0 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
157f0 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
15800 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
15810 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
15820 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
15830 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
15840 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
15850 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
15860 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
15870 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
15880 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
15890 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
158a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
158b0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
158c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
158d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
158e0 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
158f0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
15900 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
15910 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15920 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
15930 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
15940 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
15950 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
15960 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
15970 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
15980 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
15990 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
159a0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
159b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
159c0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
159d0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
159e0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
159f0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
15a00 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
15a10 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
15a20 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
15a30 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
15a40 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
15a50 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
15a60 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
15a70 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
15a80 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
15a90 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
15aa0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
15ab0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
15ac0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
15ad0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
15ae0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
15af0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
15b00 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
15b10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15b20 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
15b30 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
15b40 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
15b50 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
15b60 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
15b70 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
15b80 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
15b90 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
15ba0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
15bb0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
15bc0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
15bd0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
15be0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
15bf0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15c00 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
15c10 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
15c20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
15c30 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
15c40 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
15c50 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
15c60 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
15c70 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
15c80 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
15c90 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
15ca0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
15cb0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
15cc0 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
15cd0 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
15ce0 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
15cf0 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
15d00 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
15d10 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
15d20 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
15d30 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
15d40 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
15d50 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
15d60 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
15d70 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
15d80 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
15d90 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
15da0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
15db0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
15dc0 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
15dd0 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
15de0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
15df0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
15e00 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
15e10 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
15e20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
15e40 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
15e50 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c    assert(MEMDB||
15e60 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15e70 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
15e80 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  mpFile);.  if( p
15e90 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15ea0 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ods ){.    IOTRA
15eb0 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
15ec0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
15ed0 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
15ee0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15ef0 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
15f00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15f10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15f20 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
15f30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15f50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15f60 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
15f70 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
15f80 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
15f90 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
15fa0 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
15fb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
15fc0 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
15fd0 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
15fe0 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
15ff0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
16000 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
16010 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
16020 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
16030 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
16040 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
16050 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
16060 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
16070 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
16080 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
16090 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
160a0 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
160b0 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
160c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
160d0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
160e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
160f0 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   n = 0;.  int rc
16100 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16110 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
16120 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
16130 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
16140 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
16150 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
16160 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
16170 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
16180 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50   {.    assert(pP
16190 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
161a0 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
161b0 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28  File);.    if( (
161c0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
161d0 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72  hods).     && (r
161e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
161f0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
16200 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
16210 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
16220 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  r->nRef++;.     
16230 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16240 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16250 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
16260 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
16270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
16280 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
16290 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
162a0 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
162b0 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
162c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
162d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
162e0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
162f0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
16300 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
16310 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
16320 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
16330 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
16340 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
16350 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
16360 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
16370 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
16380 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
16390 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
163a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
163b0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
163c0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
163d0 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
163e0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
163f0 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
16400 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
16410 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
16420 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
16430 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
16440 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
16450 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
16460 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
16470 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
16480 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
16490 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
164a0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
164b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
164c0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
164d0 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
164e0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68  k pPg from its h
164f0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
16500 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
16510 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
16520 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
16530 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
16540 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
16550 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
16560 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
16570 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
16580 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
16590 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
165a0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
165b0 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
165c0 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
165d0 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
165e0 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
165f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
16600 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
16610 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
16620 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
16630 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
16640 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
16650 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
16660 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
16670 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
16680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
16690 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
166a0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
166b0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
166c0 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
166d0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
166e0 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
166f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
16700 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
16710 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
16720 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
16730 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
16740 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
16750 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
16760 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
16770 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
16780 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
16790 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
167a0 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
167b0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
167c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
167d0 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
167e0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
167f0 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
16800 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
16810 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
16820 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
16830 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
16840 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
16850 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
16860 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
16870 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
16880 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
16890 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
168a0 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
168b0 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
168c0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
168d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
168e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
168f0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
16900 20 66 72 65 65 20 70 61 67 65 20 6c 69 73 74 20   free page list 
16910 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  */.  lruListRemo
16920 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55  ve(pPg);..  /* U
16930 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70  nlink from the p
16940 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a  gno hash table *
16950 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
16960 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
16970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16980 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
16990 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
169a0 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74  cache when a dat
169b0 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e  abase.** is trun
169c0 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f  cated.  Drop fro
169d0 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20  m the cache all 
169e0 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
169f0 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68   is.** larger th
16a00 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
16a10 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
16a20 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  enced..**.** Ref
16a30 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
16a40 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
16a50 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
16a60 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  oed..**.** Actua
16a70 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e  lly, at the poin
16a80 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
16a90 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75  s called, it wou
16aa0 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  ld be.** an erro
16ab0 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65  r to have a refe
16ac0 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75  renced page.  Bu
16ad0 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65  t rather than de
16ae0 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67  lete.** that pag
16af0 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20  e and guarantee 
16b00 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67  a subsequent seg
16b10 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20  fault, it seems 
16b20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72  better.** to zer
16b30 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68  o it and hope th
16b40 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20  at we error out 
16b50 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sanely..*/.stati
16b60 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
16b70 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
16b80 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
16b90 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
16ba0 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
16bb0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
16bc0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
16bd0 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
16be0 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
16bf0 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
16c00 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
16c10 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
16c20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
16c30 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
16c40 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
16c50 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
16c60 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
16c70 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
16c80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
16c90 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
16ca0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
16cb0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
16cc0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
16cd0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
16ce0 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
16cf0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
16d00 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
16d10 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
16d20 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
16d30 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69  unt);.      unli
16d40 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
16d50 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
16d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16d70 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  _free(pPg->pData
16d80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16d90 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
16da0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
16db0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
16dc0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
16dd0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
16de0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
16df0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
16e00 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
16e10 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
16e20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
16e30 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
16e40 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
16e50 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
16e60 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
16e70 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
16e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16e90 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
16ea0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
16eb0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
16ec0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
16ed0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16ee0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
16ef0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
16f00 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
16f10 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
16f20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
16f30 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
16f40 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
16f50 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
16f60 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
16f70 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
16f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
16f90 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
16fa0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
16fb0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
16fc0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
16fd0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
16fe0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
16ff0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
17000 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
17010 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
17020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
17030 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
17040 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
17050 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
17060 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
17070 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17080 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
17090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
170a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
170b0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
170c0 6e 64 6c 65 72 20 29 20 70 50 61 67 65 72 2d 3e  ndler ) pPager->
170d0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42  pBusyHandler->nB
170e0 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20  usy = 0;.    do 
170f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
17100 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
17110 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
17120 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
17130 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
17140 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
17150 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
17160 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
17170 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
17180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17190 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
171a0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
171b0 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
171c0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
171d0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
171e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
171f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
17200 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
17210 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
17220 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
17230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17240 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
17250 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
17260 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
17270 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
17280 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
17290 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
172a0 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
172b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
172c0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
172d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
172e0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
172f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
17300 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
17310 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
17320 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
17330 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
17340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17350 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
17360 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
17370 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70  e = nPage;.    p
17380 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
17390 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
173a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
173b0 4b 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e  K;.  }.  pagerEn
173c0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
173d0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
173e0 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
173f0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
17400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17410 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17420 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
17430 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
17440 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17450 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
17460 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67  cating. */.  pag
17470 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
17480 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
17490 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
174a0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
174b0 4b 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  K);.  pagerLeave
174c0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
174d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
174e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
174f0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
17500 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
17510 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
17520 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17530 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
17540 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
17550 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
17560 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
17570 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
17580 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
17590 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
175a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
175b0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
175c0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
175d0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
175e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
175f0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
17600 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
17610 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
17620 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
17630 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
17640 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
17650 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
17660 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
17670 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
17680 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
17690 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
176a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
176b0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
176c0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
176d0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
176e0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
176f0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
17700 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
17710 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
17720 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
17730 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
17740 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
17750 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
17760 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
17770 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
17780 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
17790 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
177a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
177b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
177c0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
177d0 4d 45 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44  MENT.  if( !MEMD
177e0 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  B ){.    sqlite3
177f0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
17800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
17810 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17820 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
17830 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
17840 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
17850 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
17860 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50  Prev ){.      pP
17870 61 67 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  ager->pPrev->pNe
17880 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
17890 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
178a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
178b0 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e  rList = pPager->
178c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
178d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65   if( pPager->pNe
178e0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  xt ){.      pPag
178f0 65 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  er->pNext->pPrev
17900 20 3d 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76   = pPager->pPrev
17910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17920 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
17930 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64  mutex);.  }.#end
17940 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
17950 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
17960 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61  s();.  sqlite3Fa
17970 75 6c 74 42 65 6e 69 67 6e 28 2d 31 2c 20 31 29  ultBenign(-1, 1)
17980 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
17990 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
179a0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
179b0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
179c0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
179d0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
179e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
179f0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
17a00 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
17a10 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e   sqlite3FaultBen
17a20 69 67 6e 28 2d 31 2c 20 30 29 3b 0a 20 20 50 41  ign(-1, 0);.  PA
17a30 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
17a40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
17a50 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
17a60 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
17a70 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69 66  ", pPager)).  if
17a80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
17a90 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
17aa0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
17ab0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
17ac0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
17ad0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
17ae0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
17af0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
17b00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
17b10 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
17b20 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
17b30 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
17b40 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
17b50 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
17b60 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
17b70 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
17b80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
17b90 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
17ba0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
17bb0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
17bc0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
17bd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
17be0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
17bf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17c00 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
17c20 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
17c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17c40 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
17c50 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
17c60 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
17c70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17c80 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
17c90 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
17ca0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
17cb0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
17cc0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
17cd0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
17ce0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17cf0 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
17d00 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
17d10 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
17d20 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
17d30 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
17d40 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
17d50 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
17d60 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
17d70 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
17d80 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
17d90 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
17da0 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
17db0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
17dc0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
17dd0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
17de0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
17df0 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
17e00 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
17e10 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
17e20 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
17e30 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
17e40 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
17e50 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
17e60 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
17e70 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
17e80 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
17e90 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
17ea0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
17eb0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
17ec0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
17ed0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
17ee0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
17ef0 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
17f00 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
17f10 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
17f20 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
17f30 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
17f40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
17f50 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
17f60 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
17f70 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
17f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
17f90 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
17fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
17fb0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
17fc0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
17fd0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
17fe0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
17ff0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
18000 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
18010 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
18020 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
18030 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
18040 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
18050 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
18060 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18070 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
18080 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
18090 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
180a0 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
180b0 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
180c0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
180d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
180e0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
180f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18100 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
18110 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
18120 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
18130 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
18140 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
18150 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
18170 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
18180 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
18190 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
181a0 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
181b0 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
181c0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
181d0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
181e0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
181f0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
18200 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
18210 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
18220 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
18230 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
18240 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
18250 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
18260 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
18270 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
18280 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
18290 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
182a0 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
182b0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
182c0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
182d0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
182e0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
182f0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
18300 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
18310 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
18320 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
18330 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
18340 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
18350 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
18360 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
18370 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
18380 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
18390 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
183a0 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
183b0 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
183c0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
183d0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
183e0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
183f0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18400 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
18410 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
18420 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
18430 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
18440 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
18450 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
18460 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
18470 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
18480 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
18490 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
184a0 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
184b0 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
184c0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
184d0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
184e0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
184f0 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
18500 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
18510 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
18520 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
18530 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
18540 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
18550 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
18560 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
18570 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
18580 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
18590 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
185a0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
185b0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
185c0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
185d0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
185e0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
185f0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
18600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18610 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
18620 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18630 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
18640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
18650 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
18660 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
18670 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
18680 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
18690 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
186a0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
186b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
186c0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
186d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
186e0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
186f0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
18700 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
18710 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
18720 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
18730 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
18740 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
18750 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
18760 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
18770 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
18780 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18790 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
187a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
187b0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
187c0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
187d0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
187e0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
187f0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
18800 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
18810 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
18820 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
18830 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
18840 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
18850 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
18860 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
18870 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
18880 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
18890 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
188a0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
188b0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
188c0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
188d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
188e0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
188f0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
18900 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
18910 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
18920 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
18930 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
18940 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
18950 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
18960 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
18970 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
18980 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
18990 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
189a0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
189b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
189c0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
189d0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
189e0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
189f0 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
18a00 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
18a10 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
18a20 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
18a30 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
18a40 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
18a50 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
18a60 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
18a70 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
18a80 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
18a90 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
18aa0 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
18ab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
18ac0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
18ad0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
18ae0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
18af0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
18b00 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
18b10 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
18b20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
18b30 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
18b40 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
18b50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18b60 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
18b70 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
18b80 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
18b90 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
18ba0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
18bb0 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
18bc0 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
18bd0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18be0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
18bf0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
18c00 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
18c10 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
18c20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18c30 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18c40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18c50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18c60 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
18c70 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
18c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18c90 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
18ca0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
18cb0 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
18cc0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
18cd0 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
18ce0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
18cf0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
18d00 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
18d10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18d20 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
18d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
18d40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
18d50 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
18d60 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
18d70 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
18d80 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
18d90 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
18da0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
18db0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
18dc0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
18dd0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
18de0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
18df0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18e00 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65   }.    lruListSe
18e10 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
18e20 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  ger);.  }..#ifnd
18e30 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
18e40 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
18e50 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
18e60 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
18e70 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
18e80 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
18e90 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
18ea0 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
18eb0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
18ec0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
18ed0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
18ee0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18ef0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
18f00 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
18f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18f20 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
18f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
18f40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75  ert( pPager->lru
18f50 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  .pFirstSynced==p
18f60 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
18f70 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
18f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18f90 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
18fa0 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
18fb0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
18fc0 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
18fd0 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
18fe0 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
18ff0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
19000 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
19010 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
19020 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
19030 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
19040 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
19050 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
19060 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
19070 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
19080 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
19090 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
190a0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
190b0 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
190c0 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
190d0 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
190e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
190f0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
19100 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
19110 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
19120 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
19130 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
19140 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
19150 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
19160 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
19170 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
19180 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
19190 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
191a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
191b0 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
191c0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
191d0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
191e0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
191f0 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
19200 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
19210 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
19220 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
19230 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
19240 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
19250 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
19260 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
19270 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35  _BUCKET_ALLOC 25
19280 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
19290 42 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a  BUCKET       25.
192a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
192b0 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ST.  int sqlite3
192c0 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
192d0 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64  cket = 0;.  #und
192e0 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ef N_SORT_BUCKET
192f0 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  .  #define N_SOR
19300 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73  T_BUCKET \.   (s
19310 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
19320 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74  ort_bucket?sqlit
19330 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19340 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55  bucket:N_SORT_BU
19350 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64  CKET_ALLOC).#end
19360 69 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  if.static PgHdr 
19370 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50  *sort_pagelist(P
19380 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67  gHdr *pIn){.  Pg
19390 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55  Hdr *a[N_SORT_BU
193a0 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b  CKET_ALLOC], *p;
193b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
193c0 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
193d0 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
193e0 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
193f0 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
19400 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
19410 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
19420 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
19430 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
19440 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
19450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
19460 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
19470 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
19480 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
19490 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
194a0 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
194b0 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
194c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
194d0 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
194e0 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  -1 ){.      /* C
194f0 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20  overage: To get 
19500 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64  here, there need
19510 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54   to be 2^(N_SORT
19520 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20  _BUCKET) .      
19530 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ** elements in t
19540 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54  he input list. T
19550 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c  his is possible,
19560 20 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c   but impractical
19570 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69  ..      ** Testi
19580 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  ng this line is 
19590 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f  the point of glo
195a0 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20  bal variable.   
195b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61     ** sqlite3_pa
195c0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
195d0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
195e0 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70    a[i] = merge_p
195f0 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
19600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20  ;.    }.  }.  p 
19610 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  = a[0];.  for(i=
19620 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  1; i<N_SORT_BUCK
19630 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ET; i++){.    p 
19640 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
19650 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  (p, a[i]);.  }. 
19660 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
19670 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
19680 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
19690 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
196a0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
196b0 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
196c0 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
196d0 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
196e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
196f0 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
19700 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
19710 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19720 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
19730 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
19740 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
19750 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74   PgHdr *p;.  int
19760 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
19770 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
19780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
19790 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
197a0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
197b0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
197c0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
197d0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
197e0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
197f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
19800 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
19810 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
19820 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
19830 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
19840 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
19850 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
19860 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
19870 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
19880 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
19890 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
198a0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
198b0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
198c0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
198d0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
198e0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
198f0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
19900 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
19910 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
19920 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
19930 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
19940 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
19950 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
19960 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
19970 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
19980 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
19990 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
199a0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
199b0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
199c0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
199d0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
199e0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
199f0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
19a00 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
19a10 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
19a20 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
19a30 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
19a40 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
19a50 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
19a60 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
19a70 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
19a80 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
19a90 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
19aa0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
19ab0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
19ac0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
19ad0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
19ae0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
19af0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
19b00 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
19b10 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
19b20 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
19b30 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
19b40 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
19b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19b60 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19b70 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
19b80 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
19b90 73 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  st);.  for(p=pLi
19ba0 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
19bb0 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
19bc0 20 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20   p->dirty );.   
19bd0 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
19be0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73   }.  while( pLis
19bf0 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t ){..    /* If 
19c00 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  the file has not
19c10 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
19c20 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
19c30 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
19c40 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
19c50 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19c60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19c70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19c80 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
19c90 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  mp(pPager->pVfs,
19ca0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
19cb0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger->zFilename,.
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
19cf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
19d00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19d10 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
19d20 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
19d30 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
19d40 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
19d50 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
19d60 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
19d70 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
19d80 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
19d90 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
19da0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
19db0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
19dc0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
19dd0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
19de0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
19df0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
19e00 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
19e10 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
19e20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
19e30 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
19e40 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ize ){.      i64
19e50 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74   offset = (pList
19e60 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
19e70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19e80 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
19e90 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  ta = CODEC2(pPag
19ea0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
19eb0 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
19ec0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
19ed0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54   PAGERTRACE4("ST
19ee0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
19ef0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19f20 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70  , pList->pgno, p
19f30 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
19f40 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ist));.      IOT
19f50 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
19f60 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
19f70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  List->pgno));.  
19f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19f90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
19fa0 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
19fb0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
19fc0 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  set);.      PAGE
19fd0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
19fe0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
19ff0 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
1a000 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
1a010 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rite);.      if(
1a020 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1a030 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1a040 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1a050 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
1a060 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
1a070 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1a080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
1a090 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1a0a0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47   else{.      PAG
1a0b0 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52  ERTRACE3("NOSTOR
1a0c0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
1a0d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a0e0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1a0f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a100 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1a110 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
1a120 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1a130 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
1a140 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1a150 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
1a160 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
1a170 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1a180 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1a190 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1a1a0 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
1a1b0 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
1a1c0 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
1a1d0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1a1e0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
1a1f0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
1a200 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
1a210 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
1a220 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
1a230 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1a240 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
1a250 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1a260 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1a270 7b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  {..#ifndef NDEBU
1a280 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
1a290 65 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20  e sanity of the 
1a2a0 64 69 72 74 79 20 6c 69 73 74 20 77 68 65 6e 20  dirty list when 
1a2b0 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20  we are running. 
1a2c0 20 2a 2a 20 69 6e 20 64 65 62 75 67 67 69 6e 67   ** in debugging
1a2d0 20 6d 6f 64 65 2e 20 20 54 68 69 73 20 69 73 20   mode.  This is 
1a2e0 65 78 70 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f  expensive, so do
1a2f0 20 6e 6f 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69   not.  ** do thi
1a300 73 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  s on a normal bu
1a310 69 6c 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31  ild. */.  int n1
1a320 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d   = 0;.  int n2 =
1a330 20 30 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a   0;.  PgHdr *p;.
1a340 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1a350 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
1a360 65 78 74 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e  extAll){ if( p->
1a370 64 69 72 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a  dirty ) n1++; }.
1a380 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1a390 70 44 69 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e  pDirty; p; p=p->
1a3a0 70 44 69 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d  pDirty){ n2++; }
1a3b0 0a 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e  .  assert( n1==n
1a3c0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72  2 );.#endif..  r
1a3d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
1a3e0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
1a3f0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
1a400 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
1a410 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
1a420 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
1a430 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
1a440 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
1a450 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
1a460 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1a470 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a480 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
1a490 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
1a4a0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
1a4b0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
1a4c0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
1a4d0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
1a4e0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
1a4f0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
1a500 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
1a510 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1a520 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61  *.** Return nega
1a530 74 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74  tive if unable t
1a540 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1a550 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f  status of the jo
1a560 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
1a570 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
1a580 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ot open the jour
1a590 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  nal file to exam
1a5a0 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65  ine its.** conte
1a5b0 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  nt.  Hence, the 
1a5c0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1a5d0 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ntain the name o
1a5e0 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  f a master.** jo
1a5f0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1a600 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
1a610 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20  , and hence not 
1a620 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74  be hot.  Or.** t
1a630 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
1a640 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62   journal might b
1a650 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54  e zeroed out.  T
1a660 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
1a670 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72  oes not discover
1a680 20 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20   these cases of 
1a690 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61  a non-hot journa
1a6a0 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f  l - if the.** jo
1a6b0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
1a6c0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70  s and is not emp
1a6d0 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ty this routine 
1a6e0 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73  assumes it.** is
1a6f0 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72   hot.  The pager
1a700 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
1a710 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
1a720 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f  r that the.** jo
1a730 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1a740 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
1a750 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   will no-op..*/.
1a760 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
1a770 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
1a780 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
1a790 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1a7a0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1a7b0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 21 70 50  nt rc;.  if( !pP
1a7c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a7d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1a7e0 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1a7f0 70 4d 65 74 68 6f 64 73 20 29 20 72 65 74 75 72  pMethods ) retur
1a800 6e 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n 0;.  rc = sqli
1a810 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a820 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1a830 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
1a840 53 5f 45 58 49 53 54 53 29 3b 0a 20 20 69 66 28  S_EXISTS);.  if(
1a850 20 72 63 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc<=0 ){.    re
1a860 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1a870 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
1a880 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
1a890 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1a8a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1a8b0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
1a8c0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1a8d0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  r)==0 ){.    sql
1a8e0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
1a8f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1a900 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  nal, 0);.    ret
1a910 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1a920 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
1a940 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
1a950 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1a960 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e  can be recycled.
1a970 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
1a980 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20  tine may return 
1a990 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
1a9a0 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c  LITE_FULL or SQL
1a9b0 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64  ITE_OK. It .** d
1a9c0 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  oes not set the 
1a9d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1a9e0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1a9f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
1aa00 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61  cycle(Pager *pPa
1aa10 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
1aa20 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
1aa30 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
1aa40 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
1aa50 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  al to call this 
1aa60 66 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20  function unless 
1aa70 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1aa80 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
1aa90 20 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61   by pPager has a
1aaa0 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65  t least one free
1aab0 20 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68   page (page with
1aac0 20 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20   nRef==0)..  */ 
1aad0 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42  .  assert(!MEMDB
1aae0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
1aaf0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b  er->lru.pFirst);
1ab00 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
1ab10 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
1ab20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
1ab30 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
1ab40 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
1ab50 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
1ab60 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
1ab70 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
1ab80 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1ab90 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
1aba0 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
1abb0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
1abc0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
1abd0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
1abe0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
1abf0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
1ac00 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1ac10 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
1ac20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
1ac30 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
1ac40 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
1ac50 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
1ac60 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
1ac70 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
1ac80 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
1ac90 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  && pPager->lru.p
1aca0 46 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20  First){.    int 
1acb0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1acc0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1acd0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1ace0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
1acf0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1ad00 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1ad10 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1ad20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ad30 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1ad40 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1ad50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1ad60 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
1ad70 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
1ad80 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
1ad90 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
1ada0 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
1adb0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
1adc0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
1add0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
1ade0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
1adf0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
1ae00 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
1ae10 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
1ae20 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
1ae30 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
1ae40 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
1ae50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1ae60 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
1ae70 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
1ae80 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
1ae90 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
1aea0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
1aeb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1aec0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1aed0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1aee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1aef0 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
1af00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1af10 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1af20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1af30 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1af40 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1af50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1af60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1af70 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
1af80 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  = pPager->lru.pF
1af90 69 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  irst;.  }..  ass
1afa0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
1afb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
1afc0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
1afd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1afe0 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
1aff0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   */.  if( pPg->d
1b000 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  irty ){.    int 
1b010 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
1b020 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
1b030 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   );.    makeClea
1b040 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
1b050 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
1b060 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1b070 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1b080 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
1b090 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
1b0a0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1b0b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b0c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b0d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
1b0e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1b0f0 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
1b100 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
1b110 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
1b120 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
1b130 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
1b140 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
1b150 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
1b160 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
1b170 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
1b180 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1b190 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
1b1a0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
1b1b0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
1b1c0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
1b1d0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
1b1e0 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
1b1f0 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
1b200 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
1b210 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
1b220 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
1b230 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
1b240 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
1b250 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
1b260 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
1b270 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
1b280 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
1b290 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
1b2a0 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
1b2b0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
1b2c0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
1b2d0 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
1b2e0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
1b2f0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
1b300 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
1b310 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
1b320 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
1b330 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1b340 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
1b350 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
1b360 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
1b370 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
1b380 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
1b390 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
1b3a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1b3b0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
1b3c0 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
1b3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b3e0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1b3f0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1b400 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a  MANAGEMENT./*.**
1b410 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b420 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
1b430 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e   superfluous dyn
1b440 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
1b450 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c  ed memory.** hel
1b460 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73  d by the pager s
1b470 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e  ystem. Memory in
1b480 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69   use by any SQLi
1b490 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74  te pager allocat
1b4a0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
1b4b0 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20  rent thread may 
1b4c0 62 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  be sqlite3_free(
1b4d0 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
1b4e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b4f0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1b500 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
1b510 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
1b520 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
1b530 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
1b540 75 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e  urns. The return
1b550 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
1b560 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
1b570 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
1b580 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69  y released..*/.i
1b590 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1b5a0 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74  eleaseMemory(int
1b5b0 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52   nReq){.  int nR
1b5c0 65 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20  eleased = 0;    
1b5d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1b5e0 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65  f memory release
1b5f0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 73 71  d so far */.  sq
1b600 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
1b610 65 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ex;       /* The
1b620 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20   MEM2 mutex */. 
1b630 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b650 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1b660 20 70 61 67 65 72 73 20 2a 2f 0a 20 20 42 75 73   pagers */.  Bus
1b670 79 48 61 6e 64 6c 65 72 20 2a 73 61 76 65 64 42  yHandler *savedB
1b680 75 73 79 3b 20 20 20 20 20 2f 2a 20 53 61 76 65  usy;     /* Save
1b690 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20 62 75  d copy of the bu
1b6a0 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  sy handler */.  
1b6b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b6c0 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72  OK;..  /* Acquir
1b6d0 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e  e the memory-man
1b6e0 61 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20  agement mutex.  
1b6f0 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c  */.  mutex = sql
1b700 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1b710 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1b720 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73 71  ATIC_MEM2);.  sq
1b730 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1b740 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  r(mutex);..  /* 
1b750 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62  Signal all datab
1b760 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1b770 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61  that memory mana
1b780 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a  gement wants.  *
1b790 2a 20 74 6f 20 68 61 76 65 20 61 63 63 65 73 73  * to have access
1b7a0 20 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a   to the pagers..
1b7b0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65    */.  for(pPage
1b7c0 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  r=sqlite3PagerLi
1b7d0 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67  st; pPager; pPag
1b7e0 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  er=pPager->pNext
1b7f0 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ){.     pPager->
1b800 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20  iInUseMM = 1;.  
1b810 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
1b820 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52  SQLITE_OK && (nR
1b830 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
1b840 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50  d<nReq) ){.    P
1b850 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50  gHdr *pPg;.    P
1b860 67 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b  gHdr *pRecycled;
1b870 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  . .    /* Try to
1b880 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   find a page to 
1b890 72 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65  recycle that doe
1b8a0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  s not require a 
1b8b0 73 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a  sync(). If.    *
1b8c0 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f  * this is not po
1b8d0 73 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65  ssible, find one
1b8e0 20 74 68 61 74 20 64 6f 65 73 20 72 65 71 75 69   that does requi
1b8f0 72 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20  re a sync()..   
1b900 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1b910 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1b920 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1b930 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1b940 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70  TIC_LRU));.    p
1b950 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50  Pg = sqlite3LruP
1b960 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
1b970 6e 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28  nced;.    while(
1b980 20 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65   pPg && (pPg->ne
1b990 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70  edSync || pPg->p
1b9a0 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29  Pager->iInUseDB)
1b9b0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
1b9c0 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74  pPg->gfree.pNext
1b9d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b9e0 21 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50  !pPg ){.      pP
1b9f0 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61  g = sqlite3LruPa
1ba00 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20  geList.pFirst;. 
1ba10 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20       while( pPg 
1ba20 26 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  && pPg->pPager->
1ba30 69 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20  iInUseDB ){.    
1ba40 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67      pPg = pPg->g
1ba50 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20  free.pNext;.    
1ba60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1ba70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ba80 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
1ba90 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1baa0 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
1bab0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d  ..    /* If pPg=
1bac0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f  =0, then the blo
1bad0 63 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61 69  ck above has fai
1bae0 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61  led to find a pa
1baf0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63  ge to.    ** rec
1bb00 79 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ycle. In this ca
1bb10 73 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20  se return early 
1bb20 2d 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d  - no further mem
1bb30 6f 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ory will.    ** 
1bb40 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20  be released..   
1bb50 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1bb60 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70   ) break;..    p
1bb70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1bb80 67 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ger;.    assert(
1bb90 21 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c  !pPg->needSync |
1bba0 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c  | pPg==pPager->l
1bbb0 72 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20  ru.pFirst);.    
1bbc0 61 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64  assert(pPg->need
1bbd0 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61  Sync || pPg==pPa
1bbe0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
1bbf0 79 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 73  ynced);.  .    s
1bc00 61 76 65 64 42 75 73 79 20 3d 20 70 50 61 67 65  avedBusy = pPage
1bc10 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r->pBusyHandler;
1bc20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75  .    pPager->pBu
1bc30 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20  syHandler = 0;. 
1bc40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
1bc50 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70  cycle(pPager, &p
1bc60 52 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 70  Recycled);.    p
1bc70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1bc80 6c 65 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b  ler = savedBusy;
1bc90 0a 20 20 20 20 61 73 73 65 72 74 28 70 52 65 63  .    assert(pRec
1bca0 79 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63  ycled==pPg || rc
1bcb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  !=SQLITE_OK);.  
1bcc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bcd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
1bce0 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
1bcf0 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
1bd00 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
1bd10 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
1bd20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72     ** removed fr
1bd30 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68  om the page hash
1bd40 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73  -table, free-lis
1bd50 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73  t and synced-lis
1bd60 74 20 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 69  t .      ** (pFi
1bd70 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
1bd80 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
1bd90 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
1bda0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  list. .      ** 
1bdb0 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
1bdc0 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
1bdd0 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a  freeing..      *
1bde0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a  *.      ** Todo:
1bdf0 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
1be00 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
1be10 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
1be20 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 2a   Ok. It .      *
1be30 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
1be40 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ough..      */. 
1be50 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
1be60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1be70 70 50 67 20 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg );.      if(
1be80 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41   pPg==pPager->pA
1be90 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70  ll ){.         p
1bea0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
1beb0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
1bec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bed0 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67    for( pTmp=pPag
1bee0 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  er->pAll; pTmp->
1bef0 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
1bf00 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
1bf10 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 70  ll ){}.        p
1bf20 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
1bf30 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
1bf40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65       }.      nRe
1bf50 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20 20 20 20  leased += (.    
1bf60 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50        sizeof(*pP
1bf70 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  g) + pPager->pag
1bf80 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  eSize.          
1bf90 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
1bfa0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
1bfb0 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
1bfc0 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
1bfd0 79 29 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  y) .      );.   
1bfe0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46     IOTRACE(("PGF
1bff0 52 45 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20  REE %p %d *\n", 
1c000 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1c010 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
1c020 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1c030 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
1c040 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c050 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  _free(pPg->pData
1c060 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c070 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
1c080 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
1c090 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  -;.    }else{.  
1c0a0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
1c0b0 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
1c0c0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1c0d0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a  tabase file or .
1c0e0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
1c0f0 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
1c100 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
1c110 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
1c120 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  o the .      ** 
1c130 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
1c140 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
1c150 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
1c160 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
1c170 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  ..      ** The e
1c180 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
1c190 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
1c1a0 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
1c1b0 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
1c1c0 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70  ** of a shared p
1c1d0 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74  ager cache) of t
1c1e0 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69  he pager for whi
1c1f0 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  ch the error occ
1c200 75 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ured..      */. 
1c210 20 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20       assert(.   
1c220 20 20 20 20 20 20 20 28 72 63 26 30 78 66 66 29         (rc&0xff)
1c230 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
1c240 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d  |.          rc==
1c250 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
1c260 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
1c270 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29  ITE_BUSY.      )
1c280 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c290 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c2a0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1c2b0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
1c2c0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1c2d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c2e0 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79  Clear the memory
1c2f0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67   management flag
1c300 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  s and release th
1c310 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66  e mutex.  */.  f
1c320 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65  or(pPager=sqlite
1c330 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67  3PagerList; pPag
1c340 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65  er; pPager=pPage
1c350 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1c360 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d  pPager->iInUseMM
1c370 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1c380 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1c390 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  mutex);..  /* Re
1c3a0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1c3b0 6f 66 20 62 79 74 65 73 20 72 65 6c 65 61 73 65  of bytes release
1c3c0 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  d.  */.  return 
1c3d0 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
1c3e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1c3f0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
1c400 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
1c410 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1c420 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75  t of page pPg ou
1c430 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1c440 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1c450 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
1c460 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1c470 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f  PgHdr *pPg, Pgno
1c480 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
1c490 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a  ;.  i64 offset;.
1c4a0 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
1c4b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  =0 );.  assert(p
1c4c0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1c4d0 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
1c4e0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
1c4f0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1c500 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
1c510 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
1c520 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  HORT_READ;.  }. 
1c530 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
1c540 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1c550 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
1c560 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1c570 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
1c580 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1c590 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1c5a0 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45   offset);.  PAGE
1c5b0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1c5c0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1c5d0 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1c5e0 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1c5f0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1c600 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1c610 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66  er, pgno));.  if
1c620 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1c630 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1c640 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
1c650 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  u8*)PGHDR_TO_DAT
1c660 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20  A(pPg))[24],.   
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
1c6a0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1c6b0 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
1c6c0 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48  DEC1(pPager, PGH
1c6d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1c6e0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
1c6f0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 46    PAGERTRACE4("F
1c700 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
1c710 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1c730 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c740 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  Pg->pgno, pager_
1c750 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a  pagehash(pPg));.
1c760 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c770 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c780 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1c790 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
1c7a0 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
1c7b0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
1c7c0 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
1c7d0 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
1c7e0 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
1c7f0 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
1c800 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
1c810 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1c820 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
1c830 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
1c840 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
1c850 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1c860 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
1c870 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
1c880 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
1c890 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
1c8a0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
1c8b0 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
1c8c0 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
1c8d0 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
1c8e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1c8f0 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1c900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c910 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c920 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48  TE_OK;.  int isH
1c930 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ot = 0;..  /* If
1c940 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
1c950 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63  s opened for exc
1c960 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68  lusive access, h
1c970 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1c980 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66  g .  ** page ref
1c990 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69  erences and is i
1c9a0 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  n an error-state
1c9b0 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61  , now is the cha
1c9c0 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a  nce to clear.  *
1c9d0 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73  * the error. Dis
1c9e0 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1c9f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
1ca00 61 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61  ache and treat a
1ca10 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75  ny.  ** open jou
1ca20 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68  rnal file as a h
1ca30 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ot-journal..  */
1ca40 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
1ca50 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1ca60 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
1ca70 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 50 61  ->nRef==0 && pPa
1ca80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1ca90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1caa0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1cab0 20 20 20 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a       isHot = 1;.
1cac0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
1cad0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1cae0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
1caf0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
1cb00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1cb10 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
1cb20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
1cb30 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
1cb40 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
1cb50 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
1cb60 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
1cb70 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1cb80 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
1cb90 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
1cba0 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
1cbb0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
1cbc0 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
1cbd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1cbe0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1cbf0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1cc00 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1cc10 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1cc20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
1cc30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1cc40 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1cc50 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20   || isHot ){.   
1cc60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1cc70 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1cc80 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  s;.    if( !MEMD
1cc90 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B ){.      asser
1cca0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  t( pPager->nRef=
1ccb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1ccc0 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
1ccd0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ock ){.        r
1cce0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1ccf0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
1cd00 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
1cd10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1cd20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cd30 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1cd40 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1cd50 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
1cd60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1cd70 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
1cd80 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
1cd90 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
1cda0 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
1cdb0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
1cdc0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
1cdd0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
1cde0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1cdf0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
1ce00 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
1ce10 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
1ce20 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20   deleted..      
1ce30 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  */.      rc = ha
1ce40 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
1ce50 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1ce60 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  c<0 ){.        r
1ce70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ce80 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1ce90 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1cea0 31 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20  1 || isHot ){.  
1ceb0 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
1cec0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1ced0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1cee0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
1cef0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
1cf00 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
1cf10 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
1cf20 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
1cf30 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
1cf40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1cf50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1cf60 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
1cf70 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
1cf80 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
1cf90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1cfa0 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20  ile, detect the 
1cfb0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61  RESERVED lock, a
1cfc0 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74  nd conclude that
1cfd0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1cfe0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
1cff0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
1d000 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
1d010 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
1d020 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
1d030 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1d040 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
1d050 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
1d060 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
1d070 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
1d080 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
1d090 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
1d0a0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
1d0b0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
1d0c0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
1d0d0 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
1d0e0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
1d0f0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1d100 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1d110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d120 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1d130 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
1d140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d150 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1d160 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
1d170 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1d180 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1d190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d1a0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1d1b0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1d1d0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1d1e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1d1f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d200 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1d210 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1d220 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20  E;.        }. . 
1d230 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
1d240 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1d250 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1d260 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
1d270 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  e in .        **
1d280 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1d290 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
1d2a0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
1d2b0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
1d2c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
1d2d0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
1d2e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
1d2f0 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
1d300 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
1d310 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
1d320 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
1d330 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1d340 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
1d350 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  res.        ** a
1d360 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
1d370 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20   handle..       
1d380 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1d390 21 69 73 48 6f 74 20 26 26 20 70 50 61 67 65 72  !isHot && pPager
1d3a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1d3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1d3c0 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4f  t res = sqlite3O
1d3d0 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61  sAccess(pVfs,pPa
1d3e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51  ger->zJournal,SQ
1d3f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1d400 54 53 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  TS);.          i
1d410 66 28 20 72 65 73 3d 3d 31 20 29 7b 0a 20 20 20  f( res==1 ){.   
1d420 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
1d430 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1d440 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
1d450 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1d460 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
1d470 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
1d480 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1d490 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1d4a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1d4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1d4c0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1d4d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
1d4e0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
1d4f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
1d500 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1d510 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1d520 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
1d530 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1d540 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
1d550 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
1d560 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d570 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d580 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d590 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1d5a0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
1d5b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d5c0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d   }else if( res==
1d5d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1d5e0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
1d5f0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
1d600 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f  t, that means so
1d610 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
1d620 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1d630 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
1d640 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
1d650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1d660 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1d670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d680 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 73           /* If s
1d690 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1d6a0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
1d6b0 69 76 65 20 76 61 6c 75 65 2c 20 74 68 61 74 20  ive value, that 
1d6c0 6d 65 61 6e 73 20 69 74 0a 20 20 20 20 20 20 20  means it.       
1d6d0 20 20 20 20 20 2a 2a 20 66 61 69 6c 65 64 20 61       ** failed a
1d6e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1d6f0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
1d700 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1d710 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
1d720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d730 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d750 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
1d760 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1d770 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
1d780 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
1d790 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
1d7a0 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  MEM:.           
1d7b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
1d7c0 52 52 5f 55 4e 4c 4f 43 4b 3a 0a 20 20 20 20 20  RR_UNLOCK:.     
1d7d0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1d7e0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 0a  TE_IOERR_NOMEM:.
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d810 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
1d820 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1d830 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
1d840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1d860 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1d870 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
1d880 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1d890 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
1d8a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d8b0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
1d8c0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
1d8d0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
1d8e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d8f0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
1d900 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
1d910 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
1d920 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
1d930 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
1d940 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
1d950 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
1d960 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
1d970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d980 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1d990 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
1d9a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d9c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1d9d0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1d9e0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1d9f0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1da00 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
1da10 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
1da20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
1da30 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1da40 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
1da50 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
1da60 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
1da70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1da80 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
1da90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1daa0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
1dab0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
1dac0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
1dad0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
1dae0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
1daf0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
1db00 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
1db10 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
1db20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
1db30 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1db40 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
1db50 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
1db60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73  e.        ** has
1db70 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
1db80 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1db90 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
1dba0 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ush the.        
1dbb0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
1dbc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1dbd0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
1dbe0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
1dbf0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
1dc00 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
1dc10 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1dc20 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
1dc30 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
1dc40 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
1dc50 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  tes are.        
1dc60 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
1dc70 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
1dc80 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
1dc90 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
1dca0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
1dcb0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
1dcc0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
1dcd0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
1dce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
1dcf0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
1dd00 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1dd10 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
1dd20 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1dd30 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
1dd40 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
1dd50 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
1dd60 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
1dd70 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
1dd80 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
1dd90 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
1dda0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
1ddb0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
1ddc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ddd0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
1dde0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
1ddf0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
1de00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1de10 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1de20 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ger);..        i
1de30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1de40 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
1de50 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1de60 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
1de70 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
1de80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
1de90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
1dea0 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
1deb0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1dec0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1ded0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
1dee0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1def0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
1df00 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1df10 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
1df20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
1df30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1df40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1df50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1df60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1df70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1df80 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
1df90 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
1dfa0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
1dfb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
1dfc0 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
1dfd0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1dfe0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1dff0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
1e000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1e010 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1e020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e030 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1e040 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
1e050 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1e060 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41  Pager->state<=PA
1e070 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1e080 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1e090 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1e0a0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
1e0b0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1e0c0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
1e0d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1e0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
1e0f0 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63  te a PgHdr objec
1e100 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61  t.   Either crea
1e110 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20  te a new one or 
1e120 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73  reuse.** an exis
1e130 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73  ting one that is
1e140 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69   not otherwise i
1e150 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  n use..**.** A n
1e160 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75  ew PgHdr structu
1e170 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66  re is created if
1e180 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
1e190 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75  owing are.** tru
1e1a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
1e1b0 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78    We have not ex
1e1c0 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d  ceeded our maxim
1e1d0 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63  um allocated cac
1e1e0 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
1e1f0 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68      as set by th
1e200 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  e "PRAGMA cache_
1e210 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  size" command..*
1e220 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
1e230 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65  ere are no unuse
1e240 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  d PgHdr objects 
1e250 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69  available at thi
1e260 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s time..**.**   
1e270 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61    (3)  This is a
1e280 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1e290 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
1e2a0 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e  (4)  There are n
1e2b0 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  o PgHdr objects 
1e2c0 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75  that do not requ
1e2d0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ire a journal.**
1e2e0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73            file s
1e2f0 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f  ync and a sync o
1e300 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e310 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  le is currently.
1e320 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68  **          proh
1e330 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ibited..**.** Ot
1e340 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61  herwise, reuse a
1e350 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  n existing PgHdr
1e360 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1e370 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65  s, reuse an.** e
1e380 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66  xisting PgHdr if
1e390 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1e3a0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1e3b0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1e3c0 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f  e have reached o
1e3d0 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d  r exceeded the m
1e3e0 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a  aximum cache siz
1e3f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  e.**          al
1e400 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41  lowed by "PRAGMA
1e410 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a   cache_size"..**
1e420 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
1e430 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76  re is a PgHdr av
1e440 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48  ailable with PgH
1e450 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a  dr->nRef==0.**.*
1e460 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72  *     (3)  We ar
1e470 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d  e not in an in-m
1e480 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a  emory database.*
1e490 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69  *.**     (4)  Ei
1e4a0 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e  ther there is an
1e4b0 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72   available PgHdr
1e4c0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
1e4d0 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eed.**          
1e4e0 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20  to be synced to 
1e4f0 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73  disk or else dis
1e500 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72  k syncing is cur
1e510 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20  rently.**       
1e520 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73     allowed..*/.s
1e530 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1e540 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65  llocatePage(Page
1e550 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1e560 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20   **ppPg){.  int 
1e570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e580 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1e590 69 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20  int nByteHdr;.. 
1e5a0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
1e5b0 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66   PgHdr if any of
1e5c0 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74   the four condit
1e5d0 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20  ions defined .  
1e5e0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74  ** above are met
1e5f0 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  : */.  if( pPage
1e600 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
1e610 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50  >mxPage.   || pP
1e620 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1e630 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42  ==0 .   || MEMDB
1e640 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  .   || (pPager->
1e650 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1e660 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64  ==0 && pPager->d
1e670 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20  oNotSync).  ){. 
1e680 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
1e690 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e6a0 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
1e6b0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61  Hash ){.      pa
1e6c0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
1e6d0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
1e6e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1e6f0 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
1e700 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
1e710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1e720 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
1e730 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e740 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e750 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1e760 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1e770 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1e780 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1e790 29 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20  );.    nByteHdr 
1e7a0 3d 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  = sizeof(*pPg) +
1e7b0 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
1e7c0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
1e7e0 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
1e7f0 74 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d  tory);.    pPg =
1e800 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1e810 20 6e 42 79 74 65 48 64 72 20 29 3b 0a 20 20 20   nByteHdr );.   
1e820 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1e830 20 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65    pData = sqlite
1e840 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
1e850 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1e860 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
1e870 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e880 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20  te3_free(pPg);. 
1e890 20 20 20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a         pPg = 0;.
1e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e8b0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
1e8c0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
1e8d0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  g==0 ){.      rc
1e8e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1e8f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1e900 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a  r_allocate_out;.
1e910 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
1e920 28 70 50 67 2c 20 30 2c 20 6e 42 79 74 65 48 64  (pPg, 0, nByteHd
1e930 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 61  r);.    pPg->pDa
1e940 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  ta = pData;.    
1e950 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
1e960 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
1e970 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
1e980 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67  ->pAll;.    pPag
1e990 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
1e9a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
1e9b0 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e++;.  }else{.  
1e9c0 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20    /* Recycle an 
1e9d0 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69  existing page wi
1e9e0 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f  th a zero ref-co
1e9f0 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  unt. */.    rc =
1ea00 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1ea10 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
1ea20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea30 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72  _BUSY ){.      r
1ea40 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1ea50 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  _BLOCKED;.    }.
1ea60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ea70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
1ea80 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1ea90 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
1eaa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1eab0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
1eac0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
1ead0 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  rt(pPg);.  }.  *
1eae0 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67  ppPg = pPg;..pag
1eaf0 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a  er_allocate_out:
1eb00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1eb10 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1eb20 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e   we have the con
1eb30 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  tent for a page.
1eb40 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61    If the page wa
1eb50 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
1eb60 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1eb70 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e  Content==1, then
1eb80 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73   the content was
1eb90 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c  .** just initial
1eba0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e  ized to zeros in
1ebb0 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72  stead of being r
1ebc0 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
1ebd0 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65  * But now we nee
1ebe0 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20  d the real data 
1ebf0 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f  off of disk.  So
1ec00 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a   make sure we.**
1ec10 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20   have it.  Read 
1ec20 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e  it in if we do n
1ec30 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61  ot have it alrea
1ec40 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dy..*/.static in
1ec50 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  t pager_get_cont
1ec60 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
1ec70 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
1ec80 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  Read ){.    int 
1ec90 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1eca0 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67  pPg->pPager, pPg
1ecb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1ecc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ecd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
1ece0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1ecf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ed00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ed10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1ed20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ed30 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1ed40 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
1ed50 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
1ed60 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
1ed70 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
1ed80 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
1ed90 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
1eda0 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
1edb0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
1edc0 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
1edd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ede0 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
1edf0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
1ee00 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
1ee10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1ee20 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
1ee30 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1ee40 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
1ee50 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
1ee60 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
1ee70 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
1ee80 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
1ee90 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1eea0 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
1eeb0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
1eec0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
1eed0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
1eee0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
1eef0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
1ef00 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
1ef10 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
1ef20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
1ef30 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
1ef40 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
1ef50 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
1ef60 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
1ef70 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
1ef80 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1ef90 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
1efa0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
1efb0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1efc0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
1efd0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
1efe0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
1eff0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
1f000 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
1f010 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
1f020 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
1f030 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1f040 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
1f050 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
1f060 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
1f070 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
1f080 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
1f090 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
1f0a0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
1f0b0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
1f0c0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1f0d0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
1f0e0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
1f0f0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
1f100 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
1f110 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
1f120 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
1f130 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
1f140 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
1f150 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
1f160 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
1f170 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
1f180 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
1f190 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
1f1a0 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
1f1b0 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
1f1c0 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
1f1d0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
1f1e0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
1f1f0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1f200 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
1f210 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
1f220 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
1f230 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
1f240 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
1f250 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
1f260 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
1f270 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
1f280 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
1f290 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
1f2a0 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
1f2b0 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
1f2c0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
1f2d0 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
1f2e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f2f0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
1f300 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
1f310 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
1f320 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
1f330 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
1f340 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
1f350 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
1f360 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
1f370 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
1f380 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
1f390 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
1f3a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1f3b0 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
1f3c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
1f3d0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
1f3e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f3f0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
1f400 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
1f410 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1f420 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
1f430 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
1f440 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
1f450 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
1f460 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
1f470 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
1f480 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
1f490 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
1f4a0 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
1f4b0 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
1f4c0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
1f4d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f4e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1f4f0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
1f500 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
1f510 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
1f520 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
1f530 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
1f540 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f550 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
1f560 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
1f570 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
1f580 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
1f590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
1f5a0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
1f5b0 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
1f5c0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
1f5d0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
1f5e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f5f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1f600 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1f610 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
1f620 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
1f630 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
1f640 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1f650 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
1f660 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1f670 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
1f680 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
1f690 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
1f6a0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
1f6b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
1f6c0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
1f6d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
1f6e0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
1f6f0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1f700 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
1f710 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
1f720 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1f730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f740 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1f750 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1f760 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1f770 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
1f780 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1f790 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1f7a0 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
1f7b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
1f7c0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
1f7d0 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
1f7e0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
1f7f0 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68   nMax;.    int h
1f800 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1f810 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
1f820 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41  .    rc = pagerA
1f830 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67  llocatePage(pPag
1f840 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
1f850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f860 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f870 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1f880 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
1f890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
1f8a0 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61  EMDB || pgno>pPa
1f8b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b  ger->stmtSize );
1f8c0 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1f8d0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
1f8e0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
1f8f0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
1f900 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  );.    pPg->need
1f910 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d  Sync = 0;..    m
1f920 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1f930 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
1f940 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
1f950 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
1f960 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
1f970 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
1f980 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
1f990 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
1f9a0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
1f9b0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
1f9c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1f9d0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1f9e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1f9f0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1fa00 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1fa10 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71  rrCode;.      sq
1fa20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1fa30 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  pPg);.      retu
1fa40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1fa50 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1fa60 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
1fa70 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
1fa80 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1fa90 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
1faa0 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
1fab0 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
1fac0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
1fad0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
1fae0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
1faf0 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
1fb00 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
1fb10 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
1fb20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1fb30 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1fb40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1fb50 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1fb60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1fb70 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
1fb80 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
1fb90 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1fba0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
1fbb0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1fbc0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1fbd0 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
1fbe0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1fbf0 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
1fc00 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
1fc10 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1fc20 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
1fc30 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1fc40 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
1fc50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
1fc60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fc70 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1fc80 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1fc90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
1fca0 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
1fcb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1fcc0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1fcd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fce0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1fcf0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1fd00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
1fd10 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
1fd20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
1fd30 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
1fd40 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
1fd50 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
1fd60 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
1fd70 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
1fd80 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1fd90 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
1fda0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1fdb0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
1fdc0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
1fdd0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1fde0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
1fdf0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
1fe00 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
1fe10 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
1fe20 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1fe30 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1fe40 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
1fe50 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1fe60 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1fe70 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1fe80 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1fe90 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
1fea0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1feb0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1fec0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1fed0 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
1fee0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
1fef0 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
1ff00 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
1ff10 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1ff20 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
1ff30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1ff40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ff50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ff60 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
1ff70 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
1ff80 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1ff90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1ffa0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
1ffb0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1ffc0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1ffd0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1ffe0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fff0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
20000 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
20010 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
20020 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
20030 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
20040 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
20050 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
20060 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
20070 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
20080 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
20090 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
200a0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
200b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
200c0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
200d0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63  ;.  rc = pagerAc
200e0 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67  quire(pPager, pg
200f0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
20100 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c  ntent);.  pagerL
20110 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
20120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
20130 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
20140 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
20150 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
20160 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
20170 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
20180 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
20190 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
201a0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
201b0 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
201c0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
201d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
201e0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
201f0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
20200 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
20210 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
20220 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
20230 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
20240 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
20250 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
20260 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
20270 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
20280 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
20290 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
202a0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
202b0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
202c0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
202d0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
202e0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
202f0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
20300 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
20310 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
20320 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
20330 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
20340 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Pg = 0;..  asser
20350 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20360 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
20370 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  0 );..  pagerEnt
20380 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
20390 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
203a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
203b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
203c0 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
203d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
203e0 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ode );.  }else i
203f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20400 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
20410 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
20420 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  LL ){.    /* Do 
20430 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c  nothing */.  }el
20440 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70 61  se if( (pPg = pa
20450 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
20460 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a  r, pgno))!=0 ){.
20470 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
20480 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
20490 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
204a0 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
204b0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
204c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
204d0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
204e0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
204f0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
20500 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
20510 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
20520 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
20530 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
20540 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
20550 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
20560 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
20570 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
20580 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
20590 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
205a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
205b0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
205c0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
205d0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
205e0 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
205f0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
20600 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
20610 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  age.  */.  asser
20620 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
20630 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
20640 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70  Pg->pPager);.  p
20650 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43  Pg->nRef--;..  C
20660 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
20670 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
20680 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
20690 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
206a0 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
206b0 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
206c0 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
206d0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
206e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
206f0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20  ->nRef==0 ){..  
20700 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67    lruListAdd(pPg
20710 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
20720 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
20730 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
20740 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c  xDestructor(pPg,
20750 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20760 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
20770 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67   /* When all pag
20780 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65  es reach the fre
20790 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20  elist, drop the 
207a0 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20  read lock from. 
207b0 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
207c0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
207d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
207e0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
207f0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20  pPager->nRef>=0 
20800 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
20810 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21  r->nRef==0 && (!
20820 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
20830 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
20840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29  >journalOff>0) )
20850 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c  {.      pagerUnl
20860 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
20870 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
20880 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
20890 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
208a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
208b0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
208c0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
208d0 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
208e0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
208f0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
20900 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
20910 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20920 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
20930 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
20940 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20950 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
20960 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
20970 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
20980 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
20990 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
209a0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
209b0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
209c0 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
209d0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
209e0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
209f0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
20a00 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
20a10 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
20a20 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
20a30 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
20a40 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
20a50 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
20a60 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
20a70 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
20a80 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20a90 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
20aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20ab0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
20ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20ad0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
20ae0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
20af0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
20b00 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
20b10 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ave(pPager);.  p
20b20 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
20b30 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
20b40 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
20b50 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72  dbSize);.  pager
20b60 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
20b70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
20b80 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
20b90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20ba0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
20bb0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20bc0 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rnal;.  }..  if(
20bd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20be0 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Open==0 ){.    i
20bf0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
20c00 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61  ile ){.      fla
20c10 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
20c20 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
20c30 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
20c40 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  P_JOURNAL);.    
20c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61  }else{.      fla
20c60 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
20c70 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
20c80 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
20c90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
20ca0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72 63  MIC_WRITE.    rc
20cb0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
20cc0 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70  lOpen(.        p
20cd0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
20ce0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
20cf0 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
20d00 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
20d10 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20  ).    );.#else. 
20d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20d30 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
20d40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
20d50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
20d60 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
20d70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20d80 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
20d90 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
20da0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
20db0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
20dc0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
20dd0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  ster = 0;.    pP
20de0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20df0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
20e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20e10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20e20 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
20e30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
20e40 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
20e50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
20e60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
20e70 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
20e80 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  en_journal;.    
20e90 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  }.  }.  pPager->
20ea0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
20eb0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20ec0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
20ed0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20ee0 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
20ef0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
20f00 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
20f10 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
20f20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
20f30 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
20f40 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
20f50 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
20f60 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
20f70 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
20f80 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
20f90 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
20fa0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
20fb0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
20fc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
20fd0 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
20fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
20ff0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
21000 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
21010 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
21020 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
21030 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
21040 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
21050 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
21060 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
21070 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
21080 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
210a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
210b0 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
210c0 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
210d0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
210e0 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  l:.  sqlite3Bitv
210f0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
21100 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
21110 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21120 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
21130 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
21140 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
21150 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21160 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
21170 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
21180 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
21190 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
211a0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
211b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
211c0 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
211d0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
211e0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
211f0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
21200 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
21210 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
21220 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
21230 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
21240 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
21250 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
21260 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
21270 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
21280 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
21290 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
212a0 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
212b0 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
212c0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
212d0 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
212e0 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
212f0 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
21300 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
21310 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
21320 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
21330 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
21340 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
21350 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
21360 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
21380 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
21390 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
213a0 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
213b0 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
213c0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
213d0 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
213e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
213f0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
21400 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
21410 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
21420 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
21430 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
21440 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
21450 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
21460 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
21470 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21480 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
21490 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
214a0 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
214b0 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
214c0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
214d0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
214e0 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
214f0 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
21500 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
21510 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
21520 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
21530 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
21540 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
21550 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
21560 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
21570 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
21580 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
21590 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
215a0 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
215b0 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
215c0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
215d0 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
215e0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
215f0 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
21600 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
21610 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
21620 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
21630 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
21640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61   SQLITE_OK;.  pa
21650 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
21660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
21670 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
21680 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
21690 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
216a0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
216b0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
216c0 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
216d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
216e0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
216f0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
21700 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
21710 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
21720 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
21730 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
21740 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
21750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21770 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
21780 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
21790 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
217a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
217b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
217c0 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
217d0 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
217e0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
217f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
21800 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
21810 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
21820 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
21830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
21840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21850 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c  {.        pagerL
21860 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
21870 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21890 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
218a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
218b0 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
218c0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
218d0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
218e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
218f0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
21900 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
21920 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21930 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
21940 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
21950 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
21960 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
21970 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
21980 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
21990 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
219a0 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
219b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
219c0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
219d0 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
219e0 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
219f0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
21a00 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
21a10 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
21a20 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
21a30 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
21a40 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
21a50 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
21a60 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
21a70 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
21a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
21a90 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
21aa0 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74  open and truncat
21ab0 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20  ed to 0 bytes.. 
21ac0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
21ad0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
21ae0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21af0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
21b00 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
21b10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
21b20 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
21b30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
21b40 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
21b50 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
21b60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
21b70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21b80 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
21b90 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e  Create( pPager->
21ba0 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61  dbSize );.    pa
21bb0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
21bc0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
21bd0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->pInJournal ){
21be0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
21bf0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
21c00 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
21c10 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
21c20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21c30 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
21c40 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
21c50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
21c60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
21c70 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
21c80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21c90 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
21ca0 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72  TE_OK );.  pager
21cb0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
21cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21cd0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
21ce0 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
21cf0 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
21d00 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
21d10 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
21d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21d30 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
21d40 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
21d50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20  g->dirty==0 ){. 
21d60 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
21d70 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
21d80 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
21d90 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
21da0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44  rty = pPager->pD
21db0 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50  irty;.    if( pP
21dc0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a  ager->pDirty ){.
21dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44        pPager->pD
21de0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
21df0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
21e00 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
21e10 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
21e20 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
21e30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
21e40 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e  ke a page clean.
21e50 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74    Clear its dirt
21e60 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65  y bit and remove
21e70 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
21e80 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e  dirty page list.
21e90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21ea0 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20  makeClean(PgHdr 
21eb0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
21ec0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70  ->dirty ){.    p
21ed0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
21ee0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72     if( pPg->pDir
21ef0 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ty ){.      asse
21f00 72 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d  rt( pPg->pDirty-
21f10 3e 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67  >pPrevDirty==pPg
21f20 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
21f30 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
21f40 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
21f50 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
21f60 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
21f70 74 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ty ){.      asse
21f80 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  rt( pPg->pPrevDi
21f90 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  rty->pDirty==pPg
21fa0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
21fb0 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
21fc0 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
21fd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21fe0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
21ff0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70  Pager->pDirty==p
22000 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  Pg );.      pPg-
22010 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20  >pPager->pDirty 
22020 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
22030 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
22040 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
22050 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
22060 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
22070 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
22080 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
22090 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
220a0 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
220b0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
220c0 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
220d0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
220e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
220f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
22100 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
22110 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
22120 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
22130 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
22140 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
22150 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22160 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
22170 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
22180 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
22190 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
221a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
221b0 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
221c0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
221d0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
221e0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
221f0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
22200 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
22210 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
22220 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
22230 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
22240 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
22250 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22260 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
22270 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
22280 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
22290 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
222a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
222b0 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
222c0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
222d0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
222e0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
222f0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
22300 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
22310 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
22320 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
22330 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
22340 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
22350 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
22360 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
22370 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
22380 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
22390 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
223a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
223b0 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g);.  Pager *pPa
223c0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
223d0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
223e0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
223f0 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
22400 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
22410 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20  r->errCode ){ . 
22420 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
22430 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
22440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
22450 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
22460 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
22470 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
22480 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
22490 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
224a0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
224b0 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73  If this page was
224c0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
224d0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
224e0 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61  ent==1, that mea
224f0 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27  ns.  ** we didn'
22500 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e  t really read in
22510 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
22520 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
22530 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20  can happen.  ** 
22540 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68  (for example) wh
22550 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
22560 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
22570 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74  e freelist.  But
22580 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65  .  ** now we are
22590 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e   (perhaps) movin
225a0 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f  g the page off o
225b0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66  f the freelist f
225c0 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e  or.  ** reuse an
225d0 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  d we need to kno
225e0 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  w its original c
225f0 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63  ontent so that c
22600 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20  ontent.  ** can 
22610 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
22620 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
22630 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65  l.  So do the re
22640 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ad at this.  ** 
22650 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  time..  */.  rc 
22660 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
22670 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
22680 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
22690 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   rc;.  }..  /* M
226a0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
226b0 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
226c0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
226d0 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
226e0 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
226f0 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
22700 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
22710 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79    */.  makeDirty
22720 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
22730 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
22740 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
22750 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  pPg) || pPager->
22760 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b  stmtInUse==0) ){
22770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
22780 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d  tyCache = 1;.  }
22790 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
227a0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
227b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
227c0 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
227d0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
227e0 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
227f0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
22800 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
22810 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
22820 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
22830 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
22840 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
22850 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
22860 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
22870 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
22880 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
22890 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
228a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
228b0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
228c0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
228d0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
228e0 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
228f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22900 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
22910 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
22920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22930 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
22940 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
22950 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22960 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
22970 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  eJournal.       
22980 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
22990 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
229a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
229b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
229c0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
229d0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
229e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
229f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
22a00 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
22a10 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
22a20 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
22a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
22a40 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
22a50 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
22a60 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
22a70 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
22a80 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
22a90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
22aa0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
22ab0 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
22ac0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
22ad0 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
22ae0 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
22af0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
22b00 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
22b10 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f  l && (pPager->jo
22b20 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d  urnalOpen || MEM
22b30 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
22b40 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
22b50 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
22b60 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
22b70 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
22b80 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
22b90 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
22ba0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
22bb0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
22bc0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f   PAGERTRACE3("JO
22bd0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
22be0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
22bf0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
22c00 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
22c10 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
22c20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
22c30 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
22c40 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
22c50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22c60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
22c70 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
22c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
22c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22ca0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
22cb0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22cc0 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
22cd0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22ce0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
22cf0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ize);.        }e
22d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
22d10 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
22d20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
22d30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
22d40 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
22d50 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
22d60 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
22d70 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
22d80 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
22d90 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
22da0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
22db0 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
22dc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
22dd0 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
22de0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22df0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
22e00 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
22e10 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
22e20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
22e30 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
22e40 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
22e50 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
22e60 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
22e70 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
22e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
22e90 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
22ea0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
22eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
22ec0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
22ed0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22f00 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
22f10 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
22f20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
22f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22f60 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
22f70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
22f80 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
22f90 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
22fa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22fb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22fd0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22fe0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
22ff0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
23000 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b  rnalOff, cksum);
23010 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
23020 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
23030 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
23040 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  }.          IOTR
23050 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
23060 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
23070 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
23080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23090 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
230a0 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
230b0 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
230c0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
230d0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
230e0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
230f0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
23100 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE5("JOURNAL %d 
23110 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
23120 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
23130 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23140 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
23150 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
23160 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67  g->needSync, pag
23170 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
23180 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
23190 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
231a0 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
231b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
231c0 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
231d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
231e0 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
231f0 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
23200 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
23210 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
23220 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23230 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
23250 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
23260 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
23270 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
23280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
23290 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
232a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
232b0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
232c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
232d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
232e0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
232f0 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
23300 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
23310 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
23320 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
23330 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
23340 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  Set(pPager->pInS
23350 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  tmt, pPg->pgno);
23360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
23380 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
23390 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
233a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
233b0 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
233c0 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
233d0 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50  PAGERTRACE4("APP
233e0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
233f0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
23410 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
23420 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
23430 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
23440 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
23450 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
23460 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
23470 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
23480 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
23490 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
234a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
234b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
234c0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
234d0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
234e0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
234f0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
23500 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
23510 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
23520 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
23530 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
23540 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
23550 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
23560 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
23570 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
23580 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
23590 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
235a0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
235b0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
235c0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
235d0 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21  InUse .     && !
235e0 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
235f0 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69  pPg) .     && (i
23600 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
23610 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
23620 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
23630 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
23640 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
23650 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
23660 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
23670 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
23680 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
23690 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
236a0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
236b0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
236c0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
236d0 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
236e0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
236f0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
23700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23710 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
23720 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
23730 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
23740 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
23750 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
23760 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
23770 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
23780 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
23790 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
237a0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
237b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
237c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
237d0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
237e0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
237f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23800 20 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65         i64 offse
23810 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
23820 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  NRec*(4+pPager->
23830 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
23840 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
23850 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
23860 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
23870 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72  o, 7);.        r
23880 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
23890 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66  pPager->stfd, of
238a0 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
238b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
238c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
238d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
238e0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
238f0 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
23900 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
23910 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
23920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23930 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
23940 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
23950 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
23960 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
23970 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
23980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23990 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
239a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
239b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
239c0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
239d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
239e0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21  pPager->pInStmt!
239f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =0 );.        sq
23a00 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
23a10 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
23a20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23a30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
23a40 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
23a50 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
23a60 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
23a70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23a80 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
23a90 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
23aa0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
23ab0 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
23ac0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
23ad0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
23ae0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
23af0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
23b00 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
23b10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
23b20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
23b30 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
23b40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23b50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
23b60 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
23b70 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61  o mark a data-pa
23b80 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20  ge as writable. 
23b90 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65  It uses .** page
23ba0 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65  r_write() to ope
23bb0 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
23bc0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
23bd0 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20  lready open).** 
23be0 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61  and write the pa
23bf0 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65  ge *pData to the
23c00 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
23c10 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
23c20 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
23c30 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
23c40 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
23c50 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
23c60 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
23c70 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
23c80 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
23c90 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
23ca0 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
23cb0 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
23cc0 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
23cd0 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
23ce0 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
23cf0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
23d00 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
23d10 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
23d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23d30 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
23d40 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
23d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
23d60 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
23d70 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
23d80 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
23d90 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
23da0 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
23db0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
23dc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
23dd0 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
23de0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
23df0 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
23e00 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
23e10 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
23e20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
23e30 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
23e40 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
23e50 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
23e60 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
23e70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
23e80 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
23e90 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
23ea0 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
23eb0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
23ec0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23ed0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
23ee0 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
23ef0 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
23f00 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  i;.    int needS
23f10 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
23f20 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
23f30 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
23f40 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
23f50 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
23f60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
23f70 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
23f80 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
23f90 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
23fa0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
23fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
23fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
23fd0 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
23fe0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
23ff0 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
24000 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
24010 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
24020 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
24030 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
24040 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
24050 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
24060 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
24070 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
24080 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
24090 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
240a0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
240b0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
240c0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
240d0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
240e0 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
240f0 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
24100 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69  PageCount = sqli
24110 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24120 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
24130 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
24140 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
24150 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
24160 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
24170 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
24180 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
24190 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
241a0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
241b0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
241c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
241d0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
241e0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
241f0 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
24200 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
24210 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
24220 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
24230 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
24240 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
24250 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
24260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
24270 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
24280 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
24290 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
242a0 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
242b0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
242c0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
242d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
242e0 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
242f0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
24300 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
24310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
24320 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
24330 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
24340 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24370 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
24380 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
24390 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
243a0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
243b0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
243c0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
243d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
243e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
243f0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
24400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24410 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
24420 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
24430 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
24440 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
24450 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
24460 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
24470 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
24480 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
24490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
244a0 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72   /* If the PgHdr
244b0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
244c0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
244d0 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
244e0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
244f0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
24500 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
24510 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
24520 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
24530 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
24540 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
24550 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
24560 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
24570 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
24580 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
24590 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
245a0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
245b0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
245c0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
245d0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
245e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
245f0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
24600 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  f( needSync ){. 
24610 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
24620 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53  i<nPage && needS
24630 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ync; ii++){.    
24640 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
24650 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
24660 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
24670 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
24680 67 65 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64  ge ) pPage->need
24690 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
246a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
246b0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
246c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
246d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
246e0 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
246f0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
24700 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
24710 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
24720 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
24730 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
24740 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
24750 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24760 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24770 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
24780 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
24790 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
247a0 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
247b0 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
247c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
247d0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
247e0 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
247f0 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
24800 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
24810 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
24820 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24830 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
24840 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
24850 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
24860 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
24870 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
24880 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
24890 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
248a0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
248b0 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
248c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
248d0 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
248e0 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
248f0 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
24900 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
24910 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
24920 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
24930 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
24940 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
24950 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
24960 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
24970 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
24980 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
24990 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
249a0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
249b0 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
249c0 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
249d0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
249e0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
249f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
24a00 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
24a10 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
24a20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62  DontRollback() b
24a30 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
24a40 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
24a50 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
24a60 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
24a70 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
24a80 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
24a90 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
24aa0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24ab0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
24ac0 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
24ad0 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
24ae0 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
24af0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
24b00 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
24b10 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
24b20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
24b30 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
24b40 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
24b50 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
24b60 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
24b70 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
24b80 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
24b90 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
24ba0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
24bb0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
24bc0 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
24bd0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
24be0 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
24bf0 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
24c00 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
24c10 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
24c20 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
24c30 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
24c40 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
24c50 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
24c60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
24c70 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
24c80 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ed,.** the sqlit
24c90 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
24ca0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
24cb0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
24cc0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67  cause the.** pag
24cd0 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69  e contains criti
24ce0 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
24cf0 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
24d00 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f  re it gets.** ro
24d10 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
24d20 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  te of the sqlite
24d30 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
24d40 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
24d50 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
24d60 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20  ontWrite(DbPage 
24d70 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48  *pDbPage){.  PgH
24d80 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
24d90 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
24da0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
24db0 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
24dc0 20 72 65 74 75 72 6e 3b 0a 20 20 70 61 67 65 72   return;.  pager
24dd0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
24de0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
24df0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
24e00 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70  pPg->dirty && !p
24e10 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
24e20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24e30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
24e40 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
24e50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
24e60 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d  bSize==(int)pPg-
24e70 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
24e80 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
24e90 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
24ea0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
24eb0 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
24ec0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
24ed0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
24ee0 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
24ef0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
24f00 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
24f10 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
24f20 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
24f30 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
24f40 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
24f50 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
24f60 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
24f70 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
24f80 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
24f90 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
24fa0 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
24fb0 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
24fc0 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
24fd0 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
24fe0 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
24ff0 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
25000 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
25010 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
25020 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
25030 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
25040 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
25050 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
25060 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
25070 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
25080 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
25090 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
250a0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
250b0 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
250c0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
250d0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
250e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
250f0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
25100 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
25110 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
25120 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  o)).      makeCl
25130 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66  ean(pPg);.#ifdef
25140 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
25150 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
25160 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
25170 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
25180 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
25190 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
251a0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ger);.}../*.** A
251b0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
251c0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
251d0 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
251e0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
251f0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
25200 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
25210 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
25220 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
25230 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
25240 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
25250 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
25260 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
25270 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
25280 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
25290 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65  **.** If we have
252a0 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c   not yet actuall
252b0 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  y read the conte
252c0 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  nt of this page 
252d0 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72  (if.** the PgHdr
252e0 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69  .needRead flag i
252f0 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73  s set) then this
25300 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
25310 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68   a promise.** th
25320 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72  at we will never
25330 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   need to read th
25340 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
25350 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a  n the future..**
25360 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64   so the needRead
25370 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65   flag can be cle
25380 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ared at this poi
25390 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
253a0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
253b0 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67  back(DbPage *pPg
253c0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
253d0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
253e0 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
253f0 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
25400 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25410 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
25420 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
25430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25440 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f   not open, or Do
25450 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 62 65  ntWrite() has be
25460 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a  en called on.  *
25470 2a 20 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e  * this page (Don
25480 74 57 72 69 74 65 28 29 20 73 65 74 73 20 74 68  tWrite() sets th
25490 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
254a0 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69   flag), then thi
254b0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
254c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
254d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
254e0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ournalOpen==0 ||
254f0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
25500 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
25510 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
25520 7b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  {.    pagerLeave
25530 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
25540 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
25550 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 20 20 20  rt( !MEMDB );   
25560 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c   /* For a memdb,
25570 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25580 4f 70 65 6e 20 69 73 20 61 6c 77 61 79 73 20 30  Open is always 0
25590 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
255a0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
255b0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
255c0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
255d0 67 2d 3e 70 67 6e 6f 20 3e 20 70 50 61 67 65 72  g->pgno > pPager
255e0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
255f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25600 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
25610 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73  SECURE_DELETE is
25620 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
25630 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
25640 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72  that this.  ** r
25650 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
25660 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66  lled on a page f
25670 6f 72 20 77 68 69 63 68 20 73 71 6c 69 74 65 33  or which sqlite3
25680 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
25690 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65  .  ** has not be
256a0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  en previously ca
256b0 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  lled during the 
256c0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
256d0 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f  ..  ** And if Do
256e0 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 70 72  ntWrite() has pr
256f0 65 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61  eviously been ca
25700 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lled, the follow
25710 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69  ing.  ** conditi
25720 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e  ons must be met.
25730 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25740 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
25750 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
25760 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
25770 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73  gDbSize );..  as
25780 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
25790 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
257a0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
257b0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
257c0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
257d0 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  ;.  pPg->inJourn
257e0 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e  al = 1;.  pPg->n
257f0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 69  eedRead = 0;.  i
25800 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
25810 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
25820 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
25830 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
25840 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
25850 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
25860 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  et(pPager->pInSt
25870 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
25880 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
25890 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
258a0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
258b0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
258c0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
258d0 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42    IOTRACE(("GARB
258e0 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  AGE %p %d\n", pP
258f0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
25900 29 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ).  pagerLeave(p
25910 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Pager);.}.../*.*
25920 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25930 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
25940 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61  ement the databa
25950 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
25960 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65  ounter,.** store
25970 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20  d at byte 24 of 
25980 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
25990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
259a0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
259b0 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
259c0 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65  ager, int isDire
259d0 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ct){.  PgHdr *pP
259e0 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
259f0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
25a00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25a10 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
25a20 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
25a30 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
25a40 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
25a50 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
25a60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
25a70 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
25a80 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
25a90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
25aa0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
25ab0 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69   rc;..    if( !i
25ac0 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
25ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25ae0 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
25af0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
25b00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25b10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
25b20 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
25b30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
25b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25b50 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
25b60 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
25b70 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
25b80 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
25b90 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
25ba0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
25bb0 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
25bc0 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
25bd0 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  ers);.    change
25be0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
25bf0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
25c00 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
25c10 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61  pPgHdr))+24, cha
25c20 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
25c30 20 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20     if( isDirect 
25c40 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
25c50 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
25c60 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
25c70 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  f = PGHDR_TO_DAT
25c80 41 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  A(pPgHdr);.     
25c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
25ca0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
25cb0 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
25cc0 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
25cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
25ce0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
25cf0 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
25d00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
25d10 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61  pPgHdr);.    pPa
25d20 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
25d30 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Done = 1;.  }.  
25d40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25d50 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
25d60 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
25d70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25d80 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
25d90 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
25da0 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  c;.  pagerEnter(
25db0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
25dc0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
25dd0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
25de0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
25df0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25e00 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
25e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
25e20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25e30 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
25e40 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
25e50 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
25e60 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
25e70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
25e80 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
25e90 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
25ea0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
25eb0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
25ec0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
25ed0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
25ee0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
25ef0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
25f00 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
25f10 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
25f20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25f30 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
25f40 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
25f50 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
25f60 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
25f70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25f80 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
25f90 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
25fa0 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
25fb0 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
25fc0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
25fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
25fe0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
25ff0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
26000 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
26010 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
26020 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
26030 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
26040 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
26050 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
26060 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
26070 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
26080 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
26090 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
260a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
260b0 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e  eter nTrunc is n
260c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
260d0 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
260e0 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20  truncated to.** 
260f0 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68  nTrunc pages (th
26100 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75  is is used by au
26110 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
26120 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ses)..**.** If t
26130 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
26140 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73  er - noSync - is
26150 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
26160 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
26170 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73  self.** is not s
26180 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  ynced. The calle
26190 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  r must call sqli
261a0 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64  te3PagerSync() d
261b0 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79  irectly to.** sy
261c0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
261d0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
261e0 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54  ing CommitPhaseT
261f0 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74  wo() to delete t
26200 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
26210 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
26220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
26230 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
26240 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ne(.  Pager *pPa
26250 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ger, .  const ch
26260 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20  ar *zMaster, .  
26270 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69  Pgno nTrunc,.  i
26280 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69  nt noSync.){.  i
26290 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
262a0 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  K;..  PAGERTRACE
262b0 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  4("DATABASE SYNC
262c0 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
262d0 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e  r=%s nTrunc=%d\n
262e0 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
262f0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
26300 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ster, nTrunc);. 
26310 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
26320 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  er);..  /* If th
26330 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
26340 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
26350 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
26360 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
26370 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
26380 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26390 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
263a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
263b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
263c0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
263d0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
263e0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
263f0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
26400 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26410 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
26420 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ITE.    /* The a
26430 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
26440 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
26450 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  used if all of t
26460 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
26470 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
26480 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
26490 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
264a0 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
264b0 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
264c0 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20  rty for.    **  
264d0 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
264e0 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
264f0 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  d.    **    + Th
26500 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74  is commit is not
26510 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
26520 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
26530 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  n, and.    **   
26540 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70   + Exactly one p
26550 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  age has been mod
26560 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20  ified and store 
26570 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
26580 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
26590 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
265a0 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
265b0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ed, then the jou
265c0 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
265d0 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63  ever.    ** be c
265e0 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
265f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
26600 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41   */.    int useA
26610 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20  tomicWrite = (. 
26620 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20         !zMaster 
26630 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
26640 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
26650 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
26660 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
26670 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
26680 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20  ager) && .      
26690 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a    nTrunc==0 && .
266a0 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67          (0==pPag
266b0 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d  er->pDirty || 0=
266c0 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d  =pPager->pDirty-
266d0 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a  >pDirty).    );.
266e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
266f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
26700 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
26710 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
26720 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
26730 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d  .    if( useAtom
26740 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  icWrite ){.     
26750 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e   /* Update the n
26760 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
26770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
26780 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73  /.      int offs
26790 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
267a0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
267b0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
267c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
267d0 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a  ager->nRec==1);.
267e0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
267f0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
26800 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67  fd, offset, pPag
26810 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
26820 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
26830 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
26840 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c  ounter. The foll
26850 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
26860 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20  modify.      ** 
26870 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
26880 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
26890 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64  page 1 to includ
268a0 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20  e the updated.  
268b0 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f      ** change co
268c0 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
268d0 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65  rite page 1 dire
268e0 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
268f0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
26900 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
26910 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
26920 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
26930 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
26940 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  , .      ** this
26950 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
26960 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
26970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26980 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26990 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
269a0 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
269b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
269c0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
269d0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
269e0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
269f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26a00 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20  !useAtomicWrite 
26a10 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
26a20 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   ).#endif..    /
26a30 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
26a40 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
26a50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26a60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
26a70 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
26a80 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
26a90 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
26aa0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
26ab0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
26ac0 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
26ad0 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
26ae0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
26af0 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
26b00 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
26b10 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
26b20 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
26b30 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
26b40 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
26b50 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
26b60 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
26b70 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
26b80 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
26b90 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
26ba0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
26bb0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
26bc0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
26bd0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
26be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26bf0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
26c00 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
26c10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26c20 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
26c30 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
26c40 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
26c50 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
26c60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
26c70 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
26c80 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
26c90 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
26ca0 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
26cb0 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
26cc0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
26cd0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
26ce0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
26cf0 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
26d00 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
26d10 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
26d20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
26d30 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
26d40 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
26d50 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
26d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
26d70 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
26d80 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
26d90 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
26da0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
26db0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26dc0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
26dd0 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  i, &pPg);.      
26de0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26df0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
26e00 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
26e10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26e20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
26e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
26e40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26e50 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
26e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26e70 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26e80 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
26e90 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20   }.        } .  
26ea0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
26eb0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
26ec0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
26ed0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
26ee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26ef0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26f00 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
26f10 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
26f20 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
26f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26f40 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
26f50 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xit;..#ifndef SQ
26f60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26f70 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
26f80 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
26f90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26fa0 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
26fb0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
26fc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26fd0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
26fe0 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
26ff0 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
27000 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
27010 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
27020 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
27030 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
27040 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
27050 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
27060 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
27070 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
27080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27090 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
270a0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
270b0 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
270c0 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d    /* The error m
270d0 69 67 68 74 20 68 61 76 65 20 6c 65 66 74 20 74  ight have left t
270e0 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c  he dirty list al
270f0 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65  l fouled up here
27100 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74  ,.      ** but t
27110 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
27120 74 65 72 20 62 65 63 61 75 73 65 20 69 66 20 74  ter because if t
27130 68 65 20 69 66 20 74 68 65 20 64 69 72 74 79 20  he if the dirty 
27140 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a  list did.      *
27150 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c  * get corrupted,
27160 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   then the transa
27170 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20  ction will roll 
27180 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a  back and.      *
27190 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64 69  * discard the di
271a0 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65  rty list.  There
271b0 20 69 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e   is an assert in
271c0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
271d0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
271e0 67 65 73 28 29 20 74 68 61 74 20 76 65 72 69 66  ges() that verif
271f0 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65  ies that no atte
27200 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  mpt.      ** is 
27210 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69  made to use an i
27220 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73  nvalid dirty lis
27230 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
27240 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74    goto sync_exit
27250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
27260 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
27270 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
27280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27290 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
272a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
272b0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
272c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
272d0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
272e0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
272f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
27300 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
27310 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
27320 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
27330 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
27340 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d  .  }else if( MEM
27350 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20  DB && nTrunc!=0 
27360 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
27370 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
27380 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
27390 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74  ;.  }..sync_exit
273a0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
273b0 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
273c0 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
273d0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
273e0 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70  ter() may attemp
273f0 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65  t to obtain an e
27400 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20  xclusive.     * 
27410 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68  lock to spill th
27420 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74 75  e cache and retu
27430 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  rn IOERR_BLOCKED
27440 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20  . But since .   
27450 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20    * there is no 
27460 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68 65  chance the cache
27470 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   is inconsistent
27480 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62  , it is.     * b
27490 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  etter to return 
274a0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
274b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
274c0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
274d0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
274e0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
274f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
27500 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74  it all changes t
27510 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  o the database a
27520 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  nd release the w
27530 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  rite lock..**.**
27540 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66   If the commit f
27550 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
27560 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  son, a rollback 
27570 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a  attempt is made.
27580 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
27590 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
275a0 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
275b0 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f   worked, SQLITE_
275c0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
275d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
275e0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
275f0 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
27600 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27610 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
27620 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
27630 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
27640 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
27650 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
27660 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
27670 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
27680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27690 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65  RROR;.  }.  page
276a0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
276b0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
276c0 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
276d0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
276e0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
276f0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
27700 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
27710 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
27720 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
27730 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
27740 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
27750 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
27760 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  ;.      clearHis
27770 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
27780 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
27790 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
277a0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
277b0 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
277c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
277d0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
277e0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
277f0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
27800 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
27810 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
27820 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
27830 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
27840 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
27850 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
27860 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
27870 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
27880 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
27890 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
278a0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
278b0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
278c0 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
278d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
278e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
278f0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
27900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
27910 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
27920 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
27930 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
27940 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27950 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
27960 41 52 45 44 3b 0a 20 20 20 20 70 61 67 65 72 4c  ARED;.    pagerL
27970 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27990 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
279a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
279b0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
279c0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
279d0 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70  ache );.  rc = p
279e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
279f0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
27a00 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
27a10 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
27a20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
27a30 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
27a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
27a50 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
27a60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
27a70 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
27a80 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
27a90 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
27aa0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
27ab0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
27ac0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
27ad0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
27ae0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
27af0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27b00 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
27b10 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
27b20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
27b30 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
27b40 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
27b50 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
27b60 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
27b70 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
27b80 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
27b90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27ba0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
27bb0 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
27bc0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
27bd0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
27be0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
27bf0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
27c00 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
27c10 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
27c20 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
27c30 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
27c40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
27c50 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27c60 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
27c70 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27c80 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  rc;.  PAGERTRACE
27c90 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
27ca0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27cb0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
27cc0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
27cd0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
27ce0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
27cf0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
27d00 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
27d10 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
27d20 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
27d30 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
27d40 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
27d50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27d60 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
27d70 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
27d80 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
27d90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
27da0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
27db0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
27dc0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
27dd0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
27de0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
27df0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
27e00 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
27e10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
27e20 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
27e30 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
27e40 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
27e50 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
27e60 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27e70 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ze);.        PAG
27e80 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41  ERTRACE3("ROLLBA
27e90 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
27ea0 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
27eb0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
27ec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27ed0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
27ee0 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
27ef0 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
27f00 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
27f10 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
27f20 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
27f30 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
27f40 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
27f50 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
27f60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
27f70 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
27f80 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
27f90 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
27fa0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
27fb0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
27fc0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
27fd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
27fe0 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65  einiter(p, pPage
27ff0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
28000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28010 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
28020 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
28030 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
28040 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
28050 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
28060 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ze;.    pager_tr
28070 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
28080 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
28090 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
280a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
280b0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
280c0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
280d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
280e0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
280f0 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r);.  if( !pPage
28100 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
28110 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
28120 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
28130 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
28140 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
28150 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
28160 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
28170 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
28180 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
28190 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
281a0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
281b0 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
281c0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
281d0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
281e0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
281f0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
28200 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
28210 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28220 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
28230 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
28240 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
28250 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
28260 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
28270 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
28280 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
28290 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
282a0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
282b0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
282c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
282d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
282e0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
282f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
28300 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
28310 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
28320 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
28330 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
28340 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
28350 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
28360 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
28370 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
28380 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
28390 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
283a0 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
283b0 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
283c0 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
283d0 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
283e0 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
283f0 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tent..  */.  rc 
28400 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
28410 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
28420 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28430 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28440 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28450 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
28460 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
28470 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
28480 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
28490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
284a0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
284b0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
284c0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
284d0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
284e0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
284f0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
28500 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
28520 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
28530 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
28540 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
28550 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
28560 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
28570 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
28580 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
28590 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
285a0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
285b0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
285c0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
285d0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
285e0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
285f0 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
28600 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
28610 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
28620 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
28630 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
28640 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
28650 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
28660 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
28670 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
28680 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
28690 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
286a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
286b0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
286c0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
286d0 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
286e0 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
286f0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
28700 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
28710 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
28720 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
28730 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
28740 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
28750 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
28760 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
28770 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
28780 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
28790 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
287a0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
287b0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
287c0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
287d0 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
287e0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
287f0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
28800 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
28810 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
28820 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
28830 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
28840 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74  ic int pagerStmt
28850 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
28860 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
28870 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
28880 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
28890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
288a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
288b0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
288c0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
288d0 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
288e0 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
288f0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
28900 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
28910 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
28920 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
28930 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
28940 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
28950 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
28960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28970 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
28980 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
28990 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
289a0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
289b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
289c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
289d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
289e0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
289f0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
28a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28a10 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
28a20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
28a30 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69  Stmt = sqlite3Bi
28a40 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
28a50 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61  r->dbSize);.  pa
28a60 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
28a70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
28a80 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  pInStmt==0 ){.  
28a90 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
28aa0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
28ab0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
28ac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28ad0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
28ae0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
28af0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
28b00 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
28b10 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
28b20 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
28b30 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
28b40 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
28b50 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
28b60 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
28b70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
28b80 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
28b90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
28ba0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
28bb0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74  pVfs, pPager->st
28bc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d  fd, pPager->zStm
28bd0 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20 20  tJrnl,.         
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
28c00 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
28c10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
28c20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69    goto stmt_begi
28c30 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  n_failed;.    }.
28c40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
28c50 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50  Open = 1;.    pP
28c60 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
28c70 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
28c80 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
28c90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28ca0 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69  _OK;. .stmt_begi
28cb0 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  n_failed:.  if( 
28cc0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
28cd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
28ce0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
28cf0 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
28d00 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d    pPager->pInStm
28d10 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
28d20 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
28d30 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
28d40 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
28d50 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
28d60 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
28d70 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
28d80 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
28d90 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
28da0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
28db0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
28dc0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
28dd0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
28de0 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
28df0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28e00 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28e10 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
28e20 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
28e30 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
28e40 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
28e50 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
28e60 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
28e70 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
28e80 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
28e90 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
28ea0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
28eb0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
28ec0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
28ed0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
28ee0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
28ef0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
28f00 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
28f10 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  lse{.      for(p
28f20 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
28f30 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
28f40 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
28f50 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
28f60 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
28f70 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
28f80 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d    pNext = pHist-
28f90 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
28fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
28fb0 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  t->inStmt );.   
28fc0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
28fd0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
28fe0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
28ff0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
29000 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
29010 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
29020 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
29030 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
29040 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
29050 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
29060 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
29070 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
29080 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
29090 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
290a0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
290b0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
290c0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
290d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
290e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
290f0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
29100 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
29110 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
29120 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
29130 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
29140 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
29150 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
29160 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
29170 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
29180 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
29190 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
291a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
291b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
291c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
291d0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
291e0 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f  *pHist;.      fo
291f0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
29200 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48  tmt; pPg; pPg=pH
29210 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  ist->pNextStmt){
29220 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d  .        pHist =
29230 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
29240 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
29250 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
29260 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
29270 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
29280 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
29290 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
292a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
292b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
292c0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
292d0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
292e0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
292f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29300 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
29310 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
29320 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
29330 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
29340 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
29350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29360 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
29370 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29380 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
29390 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
293a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
293b0 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
293c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
293d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
293e0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
293f0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
29400 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
29410 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
29420 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
29430 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
29440 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
29450 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
29460 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29470 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
29480 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29490 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
294a0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
294b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
294c0 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
294d0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
294e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
294f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
29500 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
29510 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
29520 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
29530 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
29540 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
29550 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
29560 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
29570 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
29580 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
29590 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
295a0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
295b0 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
295c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
295d0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
295e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
295f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
29600 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
29610 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
29620 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
29630 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
29640 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
29650 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
29660 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
29670 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
29680 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
29690 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
296a0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
296b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
296c0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
296d0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
296e0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
296f0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
29700 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
29710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29720 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
29730 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
29740 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
29750 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
29760 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
29770 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
29780 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
29790 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
297a0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
297b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
297c0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
297d0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
297e0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
297f0 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
29800 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
29810 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
29820 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
29830 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
29840 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
29850 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
29860 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
29870 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
29880 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
29890 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
298a0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
298b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
298c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
298d0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
298e0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
298f0 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
29900 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
29910 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
29920 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
29930 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
29940 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
29950 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
29960 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
29970 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
29980 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
29990 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
299a0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
299b0 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64  previous located
299c0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
299d0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
299e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
299f0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
29a00 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
29a10 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
29a20 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
29a30 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
29a40 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
29a50 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
29a60 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
29a70 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
29a80 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
29a90 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
29aa0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
29ab0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
29ac0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
29ad0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
29ae0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
29af0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
29b00 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
29b10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
29b20 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
29b30 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
29b40 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
29b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
29b60 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
29b70 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
29b80 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
29b90 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
29ba0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
29bb0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
29bc0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
29bd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
29be0 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
29bf0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
29c00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29c10 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
29c20 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
29c30 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
29c40 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
29c50 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69  rwritten. */.  i
29c60 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
29c70 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
29c80 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
29c90 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
29ca0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
29cb0 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
29cc0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
29cd0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
29ce0 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
29cf0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
29d00 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
29d10 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
29d20 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
29d30 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
29d40 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
29d50 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
29d60 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
29d70 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  nt(pPg);.  if( p
29d80 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
29d90 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
29da0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
29db0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
29dc0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
29dd0 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
29de0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
29df0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
29e00 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
29e10 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
29e20 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
29e30 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
29e40 69 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  its hash-chain *
29e50 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
29e60 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
29e70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
29e80 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
29e90 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
29ea0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
29eb0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
29ec0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
29ed0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
29ee0 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
29ef0 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
29f00 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
29f10 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
29f20 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
29f30 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
29f40 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
29f50 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
29f60 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  /.  pPg->needSyn
29f70 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20  c = 0;.  pPgOld 
29f80 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29f90 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
29fa0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
29fb0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
29fc0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
29fd0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
29fe0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
29ff0 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
2a000 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
2a010 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67  ->needSync = pPg
2a020 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20  Old->needSync;. 
2a030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d   }else{.    pPg-
2a040 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
2a050 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   }.  pPg->inJour
2a060 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
2a070 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
2a080 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
2a090 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20  );..  /* Change 
2a0a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2a0b0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
2a0c0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
2a0d0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
2a0e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
2a0f0 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
2a100 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
2a110 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
2a120 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
2a130 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2a140 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
2a150 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2a160 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
2a170 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
2a180 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
2a190 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
2a1a0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
2a1b0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
2a1c0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
2a1d0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
2a1e0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
2a1f0 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
2a200 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
2a210 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
2a220 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
2a230 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
2a240 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
2a250 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2a260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a270 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
2a280 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
2a290 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
2a2a0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
2a2b0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
2a2c0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
2a2d0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
2a2e0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
2a2f0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
2a300 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
2a310 20 20 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f    ** Pager.pInJo
2a320 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65  urnal bit has be
2a330 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
2a340 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
2a350 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20  d by loading.   
2a360 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74   ** the page int
2a370 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
2a380 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
2a390 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
2a3a0 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
2a3b0 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65    ** If the atte
2a3c0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  mpt to load the 
2a3d0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
2a3e0 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20  ge-cache fails, 
2a3f0 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61  (due.    ** to a
2a400 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
2a410 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20  failure), clear 
2a420 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70  the bit in the p
2a430 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20  InJournal[].    
2a440 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  ** array. Otherw
2a450 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65  ise, if the page
2a460 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77   is loaded and w
2a470 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a  ritten again in.
2a480 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e      ** this tran
2a490 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20  saction, it may 
2a4a0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2a4b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a4c0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74  before.    ** it
2a4d0 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20   is synced into 
2a4e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a4f0 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d  . This way, it m
2a500 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20  ay end up in.   
2a510 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2a520 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20  file twice, but 
2a530 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
2a540 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20  oblem..    **.  
2a550 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
2a560 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
2a570 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
2a580 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
2a590 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
2a5a0 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
2a5b0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
2a5c0 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
2a5d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67    int rc;.    Pg
2a5e0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
2a5f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a600 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
2a610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a620 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
2a630 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
2a640 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
2a650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a660 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2a670 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >pInJournal && (
2a680 69 6e 74 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f  int)needSyncPgno
2a690 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
2a6a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
2a6b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65  sqlite3BitvecCle
2a6c0 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ar(pPager->pInJo
2a6d0 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50  urnal, needSyncP
2a6e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
2a6f0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
2a700 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65  Pager);.      re
2a710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2a720 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
2a730 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
2a740 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
2a750 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
2a760 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
2a770 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
2a780 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
2a790 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
2a7a0 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72  r);.  }..  pager
2a7b0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
2a7c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a7d0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
2a7e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
2a7f0 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
2a800 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
2a810 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
2a820 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
2a830 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
2a840 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  ){.  return PGHD
2a850 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
2a860 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a870 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2a880 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
2a890 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
2a8a0 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
2a8b0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
2a8c0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2a8d0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
2a8e0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2a8f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2a900 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a910 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72  pPg->pPager;.  r
2a920 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47  eturn (pPager?PG
2a930 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
2a940 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a  , pPager):0);.}.
2a950 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
2a960 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
2a970 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
2a980 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
2a990 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
2a9a0 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
2a9b0 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
2a9c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2a9d0 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
2a9e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2a9f0 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
2aa00 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2aa10 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
2aa20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
2aa30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
2aa40 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
2aa50 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2aa60 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
2aa70 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
2aa80 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
2aa90 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
2aaa0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
2aab0 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
2aac0 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
2aad0 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
2aae0 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
2aaf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
2ab00 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
2ab10 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
2ab20 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
2ab30 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2ab40 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
2ab50 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
2ab60 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2ab70 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
2ab80 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
2ab90 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2aba0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2abb0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2abc0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
2abd0 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
2abe0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
2abf0 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
2ac00 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2ac10 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
2ac20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
2ac30 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
2ac40 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
2ac50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2ac60 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d  ode = eMode;.  }
2ac70 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
2ac80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2ac90 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
2aca0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
2acb0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
2acc0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
2acd0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
2ace0 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
2acf0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
2ad00 59 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  Y, PAGER_JOURNAL
2ad10 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 20 0a  MODE_DELETE or .
2ad20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
2ad30 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 49 66  MODE_PERSIST. If
2ad40 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
2ad50 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
2ad60 65 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  en.** the journa
2ad70 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  l-mode is set to
2ad80 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
2ad90 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
2ada0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
2adb0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4a  s either PAGER_J
2adc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
2add0 45 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  E or.** PAGER_JO
2ade0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2adf0 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  T, indicating th
2ae00 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
2ae10 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
2ae20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f  journal-mode..*/
2ae30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2ae40 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  rJournalMode(Pag
2ae50 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2ae60 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
2ae70 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
2ae80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
2ae90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2aea0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
2aeb0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2aed0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2aee0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2af00 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2af10 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
2af20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
2af30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
2af40 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
2af50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2af60 45 5f 44 45 4c 45 54 45 3e 3d 30 20 26 26 20 50  E_DELETE>=0 && P
2af70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2af80 5f 50 45 52 53 49 53 54 3e 3d 30 20 29 3b 0a 20  _PERSIST>=0 );. 
2af90 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
2afa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2afb0 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  rnalMode = eMode
2afc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
2afd0 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
2afe0 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64  nalMode;.}..#ifd
2aff0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2b000 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
2b010 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
2b020 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
2b030 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
2b040 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2b050 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
2b060 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2b070 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
2b080 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2b090 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2b0a0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2b0b0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
2b0c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2b0d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2b0e0 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
2b0f0 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
2b100 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
2b110 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
2b120 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
2b130 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
2b140 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
2b150 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
2b160 20 2a 2f 0a                                       */.