/ Hex Artifact Content
Login

Artifact 1960545a871f9b57a80e485e5969ee045b7a00d8:


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 30  : pager.c,v 1.40
0350: 36 20 32 30 30 38 2f 30 32 2f 31 34 20 32 33 3a  6 2008/02/14 23:
0360: 32 36 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a  26:56 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 28 70 50 61 67 65 72 2d  urnal = (pPager-
24d0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67 6e  >aInJournal[(pgn
24e0: 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28 28  o-1)/8] & (1<<((
24f0: 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a 2a  pgno-1)%8))!=0.*
2500: 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 70 50 61  *.**     The pPa
2510: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
2520: 5d 20 61 72 72 61 79 20 69 73 20 6f 6e 6c 79 20  ] array is only 
2530: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6f 72  valid for the or
2540: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70 61  iginal.**     pa
2550: 67 65 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ges of the datab
2560: 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61 67  ase, not new pag
2570: 65 73 20 74 68 61 74 20 61 72 65 20 61 64 64 65  es that are adde
2580: 64 20 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20  d to the end.** 
2590: 20 20 20 20 6f 66 20 74 68 65 20 64 61 74 61 62      of the datab
25a0: 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73 6c  ase, so obviousl
25b0: 79 20 74 68 65 20 61 62 6f 76 65 20 65 78 70 72  y the above expr
25c0: 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  ession cannot be
25d0: 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64 20 66 6f  .**     valid fo
25e0: 72 20 6e 65 77 20 70 61 67 65 73 2e 20 20 46 6f  r new pages.  Fo
25f0: 72 20 6e 65 77 20 70 61 67 65 73 20 69 6e 4a 6f  r new pages inJo
2600: 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20  urnal is always 
2610: 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a  0..**.** dirty.*
2620: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e 20 74 72  *.**     When tr
2630: 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  ue, this means t
2640: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
2650: 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  of the page has 
2660: 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64 69  been.**     modi
2670: 66 69 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  fied and needs t
2680: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63  o be written bac
2690: 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
26a0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 49  e file..**     I
26b0: 66 20 66 61 6c 73 65 2c 20 69 74 20 6d 65 61 6e  f false, it mean
26c0: 73 20 74 68 61 74 20 65 69 74 68 65 72 20 74 68  s that either th
26d0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
26e0: 20 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 20   page is.**     
26f0: 75 6e 63 68 61 6e 67 65 64 20 6f 72 20 65 6c 73  unchanged or els
2700: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  e the content is
2710: 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e 64   unimportant and
2720: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20   we do not.**   
2730: 20 20 63 61 72 65 20 77 68 65 74 68 65 72 20 6f    care whether o
2740: 72 20 6e 6f 74 20 69 74 20 69 73 20 70 72 65 73  r not it is pres
2750: 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77  erved..**.** alw
2760: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a  aysRollback.**.*
2770: 2a 20 20 20 20 20 54 68 69 73 20 6d 65 61 6e 73  *     This means
2780: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
2790: 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
27a0: 63 6b 28 29 20 41 50 49 20 73 68 6f 75 6c 64 20  ck() API should 
27b0: 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65  be.**     ignore
27c0: 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 2e  d for this page.
27d0: 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61    The DontRollba
27e0: 63 6b 28 29 20 41 50 49 20 61 74 74 65 6d 70 74  ck() API attempt
27f0: 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20 20  s to say.**     
2800: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2810: 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 6e 20   of the page on 
2820: 64 69 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72 74  disk is unimport
2830: 61 6e 74 20 28 69 74 20 69 73 20 61 6e 0a 2a 2a  ant (it is an.**
2840: 20 20 20 20 20 75 6e 75 73 65 64 20 70 61 67 65       unused page
2850: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2860: 29 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  ) so that it is 
2870: 75 6e 6e 65 63 65 73 73 61 72 79 20 74 6f 20 0a  unnecessary to .
2880: 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  **     rollback 
2890: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  changes to this 
28a0: 70 61 67 65 20 62 65 63 61 75 73 65 20 74 68 65  page because the
28b0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
28c0: 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e 20  page.**     can 
28d0: 63 68 61 6e 67 65 20 77 69 74 68 6f 75 74 20 63  change without c
28e0: 68 61 6e 67 69 6e 67 20 74 68 65 20 6d 65 61 6e  hanging the mean
28f0: 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
2900: 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20  ase.  This.**   
2910: 20 20 66 6c 61 67 20 6f 76 65 72 72 69 64 65 73    flag overrides
2920: 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61 63   any DontRollbac
2930: 6b 28 29 20 61 74 74 65 6d 70 74 2e 20 20 54 68  k() attempt.  Th
2940: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a  is flag is set.*
2950: 2a 20 20 20 20 20 77 68 65 6e 20 61 20 70 61 67  *     when a pag
2960: 65 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c  e that originall
2970: 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 69  y contained vali
2980: 64 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  d data is added 
2990: 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72  to.**     the fr
29a0: 65 65 6c 69 73 74 2e 20 20 4c 61 74 65 72 20 69  eelist.  Later i
29b0: 6e 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  n the same trans
29c0: 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 70 61 67  action, this pag
29d0: 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20 62  e might.**     b
29e0: 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68  e pulled from th
29f0: 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 72  e freelist and r
2a00: 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68  eused for someth
2a10: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
2a20: 20 20 20 20 20 61 6e 64 20 61 74 20 74 68 61 74       and at that
2a30: 20 70 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74 52   point the DontR
2a40: 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 77 69  ollback() API wi
2a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 63  ll be called bec
2a60: 61 75 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65  ause.**     page
2a70: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
2a80: 20 66 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f 74   freelist do not
2a90: 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 6f 74   need to be prot
2aa0: 65 63 74 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  ected by.**     
2ab0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
2ac0: 72 6e 61 6c 2e 20 20 42 75 74 20 74 68 69 73 20  rnal.  But this 
2ad0: 66 6c 61 67 20 73 61 79 73 20 74 68 61 74 20 74  flag says that t
2ae0: 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 20  he page was.**  
2af0: 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c     not originall
2b00: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  y part of the fr
2b10: 65 65 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69  eelist so that i
2b20: 74 20 73 74 69 6c 6c 20 6e 65 65 64 73 20 74 6f  t still needs to
2b30: 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c 65  .**     be rolle
2b40: 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
2b50: 6f 66 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e  of any subsequen
2b60: 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  t DontRollback()
2b70: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65   calls..**.** ne
2b80: 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20  edRead .**.**   
2b90: 20 20 54 68 69 73 20 66 6c 61 67 20 6d 65 61 6e    This flag mean
2ba0: 73 20 28 77 68 65 6e 20 74 72 75 65 29 20 74 68  s (when true) th
2bb0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
2bc0: 66 20 74 68 65 20 70 61 67 65 20 68 61 73 0a 2a  f the page has.*
2bd0: 2a 20 20 20 20 20 6e 6f 74 20 79 65 74 20 62 65  *     not yet be
2be0: 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64  en loaded from d
2bf0: 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65 6d  isk.  The in-mem
2c00: 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69 73 20 6a  ory content is j
2c10: 75 73 74 0a 2a 2a 20 20 20 20 20 67 61 72 62 61  ust.**     garba
2c20: 67 65 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c 20  ge.  (Actually, 
2c30: 77 65 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e 74  we zero the cont
2c40: 65 6e 74 2c 20 62 75 74 20 79 6f 75 20 73 68 6f  ent, but you sho
2c50: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d  uld not.**     m
2c60: 61 6b 65 20 61 6e 79 20 61 73 73 75 6d 70 74 69  ake any assumpti
2c70: 6f 6e 73 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ons about the co
2c80: 6e 74 65 6e 74 20 6e 65 76 65 72 74 68 65 6c 65  ntent neverthele
2c90: 73 73 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20  ss.)  If the.** 
2ca0: 20 20 20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e      content is n
2cb0: 65 65 64 65 64 20 69 6e 20 74 68 65 20 66 75 74  eeded in the fut
2cc0: 75 72 65 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ure, it should b
2cd0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 0a  e read from the.
2ce0: 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 20  **     original 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2d00: 2f 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  /.struct PgHdr {
2d10: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d30: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
2d40: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
2d50: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
2d60: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d80: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2d90: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
2da0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
2db0: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
2dc0: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
2dd0: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
2de0: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50  gHdr.pgno */.  P
2df0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66 72 65 65  agerLruLink free
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e10: 20 4e 65 78 74 20 61 6e 64 20 70 72 65 76 69 6f   Next and previo
2e20: 75 73 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  us free pages */
2e30: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
2e40: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2e50: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
2e60: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2e70: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e90: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
2ea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
2eb0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2ec0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2ee0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
2ef0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
2f00: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2f10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f20: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
2f30: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
2f40: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
2f50: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2f60: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
2f70: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
2f80: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
2f90: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2fa0: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc0: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
2fd0: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
2fe0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
2ff0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
3000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3010: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
3020: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
3030: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
3040: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
3050: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
3060: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3070: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
3080: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
3090: 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20 20  LruLink gfree;  
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f            /* Glo
30b0: 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65 66  bal list of nRef
30c0: 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e  ==0 pages */.#en
30d0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30e0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
30f0: 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65  u32 pageHash;.#e
3100: 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a 70 44 61  ndif.  void *pDa
3110: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
3120: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61        /* Page da
3130: 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  ta */.  /* Pager
3140: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
3150: 20 6c 6f 63 61 6c 20 64 61 74 61 20 61 70 70 65   local data appe
3160: 6e 64 65 64 20 74 6f 20 74 68 69 73 20 68 65 61  nded to this hea
3170: 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  der */.};../*.**
3180: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
3190: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
31a0: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
31b0: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
31c0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
31d0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
31e0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
31f0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
3200: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
3210: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
3220: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3230: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
3240: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3250: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
3260: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
3270: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
3280: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3290: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
32a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
32b0: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
32c0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
32d0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
32e0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
32f0: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
3300: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
3310: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
3320: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
3330: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
3340: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
3350: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
3360: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
3370: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
3380: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
3390: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
33a0: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
33b0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
33c0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
33d0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
33e0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
33f0: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
3400: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
3410: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
3420: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
3430: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
3440: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
3450: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
3460: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
3470: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
3480: 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ment */.  PgHdr 
3490: 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72  *pNextStmt, *pPr
34a0: 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74  evStmt;  /* List
34b0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
34c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34d0: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d  al */.  u8 inStm
34e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
34f0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
3500: 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  f in the stateme
3510: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  .};../*.** A mac
3530: 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f  ro used for invo
3540: 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69  king the codec i
3550: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a  f there is one.*
3560: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3570: 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69  HAS_CODEC.# defi
3580: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
3590: 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63  X) if( P->xCodec
35a0: 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63  !=0 ){ P->xCodec
35b0: 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c  (P->pCodecArg,D,
35c0: 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65  N,X); }.# define
35d0: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
35e0: 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f   ((char*)(P->xCo
35f0: 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63  dec!=0?P->xCodec
3600: 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c  (P->pCodecArg,D,
3610: 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23  N,X):D)).#else.#
3620: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
3630: 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50  ,D,N,X) /* NO-OP
3640: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44   */.# define COD
3650: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
3660: 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a  har*)D).#endif..
3670: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
3680: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
3690: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
36a0: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
36b0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
36c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
36d0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 20 20  R_TO_DATA(P)    
36e0: 28 28 50 29 2d 3e 70 44 61 74 61 29 0a 23 64 65  ((P)->pData).#de
36f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
3700: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
3710: 29 26 28 28 47 29 5b 31 5d 29 29 0a 23 64 65 66  )&((G)[1])).#def
3720: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  ine PGHDR_TO_HIS
3730: 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20  T(P,PGR)  \.    
3740: 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74          ((PgHist
3750: 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26  ory*)&((char*)(&
3760: 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e  (P)[1]))[(PGR)->
3770: 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20  nExtra])../*.** 
3780: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
3790: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
37a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
37b0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
37c0: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
37d0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
37e0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
37f0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a  ITE_CORRUPT, or.
3800: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  ** or SQLITE_FUL
3810: 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74  L. Once one of t
3820: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65  he first three e
3830: 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74  rrors occurs, it
3840: 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64   persists.** and
3850: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
3860: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
3870: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
3880: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
3890: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65  * SQLITE_FULL re
38a0: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
38b0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
38c0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
38d0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  y until the.** n
38e0: 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72  ext successful r
38f0: 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f  ollback is perfo
3900: 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  rmed on the page
3910: 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a  r cache. Also,.*
3920: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f  * SQLITE_FULL do
3930: 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
3940: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
3950: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  t() and sqlite3P
3960: 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  agerLookup().** 
3970: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
3980: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
3990: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74  cessfully..*/.st
39a0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
39b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
39c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
39d0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
39e0: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
39f0: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
3a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a10: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
3a20: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
3a30: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
3a40: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
3a50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3a60: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
3a70: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
3a80: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3aa0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3ab0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3ac0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3ad0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3af0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3b00: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3b10: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
3b40: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3b50: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
3b60: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
3b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3b80: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
3b90: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
3ba0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
3bb0: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
3bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
3bd0: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
3be0: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
3bf0: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
3c00: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c20: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
3c30: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
3c40: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c60: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
3c70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
3c80: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
3c90: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
3ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3cb0: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
3cc0: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
3cd0: 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  L */.  u8 state;
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3d00: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3d10: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3d20: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
3d50: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
3d60: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
3d90: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
3da0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3db0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3dc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3dd0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3de0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3df0: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61   */.  u8 dirtyCa
3e00: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
3e10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
3e20: 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63  hed pages have c
3e30: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61  hanged */.  u8 a
3e40: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
3e50: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
3e60: 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  le DontRollback(
3e70: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
3e80: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
3eb0: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
3ec0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
3ed0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3ef0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3f00: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3f10: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
3f20: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3f30: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
3f40: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
3f50: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
3f60: 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69   */.  u8 exclusi
3f70: 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  veMode;         
3f80: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72    /* Boolean. Tr
3f90: 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ue if locking_mo
3fa0: 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f  de==EXCLUSIVE */
3fb0: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
3fc0: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
3fd0: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
3fe0: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
3ff0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
4000: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4020: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
4030: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
4040: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4060: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
4070: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
4080: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
40b0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
40d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
4100: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
4110: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
4120: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4130: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
4140: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
4150: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
4160: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
4170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4180: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4190: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
41a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
41b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
41c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
41d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
41e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
41f0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
4200: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4220: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
4230: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
4240: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
4250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4260: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
4270: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
4280: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
4290: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
42a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
42b0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
42c0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
42d0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
42e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
42f0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
4300: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
4310: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
4320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4330: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
4340: 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48  y pages with PgH
4350: 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69  dr.nRef>0 */.  i
4360: 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20  nt mxPage;      
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
4380: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
4390: 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e  pages to hold in
43a0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
43b0: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
43c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43d0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
43e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
43f0: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72  */.  u8 *aInJour
4400: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4410: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4420: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
4440: 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b  /.  u8 *aInStmt;
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
4470: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4480: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
4490: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
44b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
44c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
44d0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
44f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
4520: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
4530: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
4540: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
4550: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74  s */.  char *zSt
4560: 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20 20 20 20  mtJrnl;         
4570: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4580: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
4590: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  nal file */.  sq
45a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
45b0: 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c  *jfd;     /* Fil
45c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
45d0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
45e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
45f0: 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20  te3_file *stfd; 
4600: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4610: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
4620: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4630: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
4640: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
4650: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
4660: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
4670: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61  yHandler */.  Pa
4680: 67 65 72 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20  gerLruList lru; 
4690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 52 55            /* LRU
46a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
46b0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
46c0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
46d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
46e0: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
46f0: 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20  gHdr *pStmt;    
4700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
4710: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
4720: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4730: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48  journal */.  PgH
4740: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
4750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
4760: 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   of all dirty pa
4770: 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ges */.  i64 jou
4780: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
4790: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
47a0: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
47b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
47c0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
47d0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
47e0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
47f0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
4800: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
4810: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
4820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4830: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
4840: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
4850: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
4860: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
4870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
4880: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
4890: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
48a0: 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ted */.  i64 stm
48b0: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
48c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
48d0: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
48e0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
48f0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
4900: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
4910: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
4920: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
4930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4940: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
4950: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
4960: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
4970: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
4980: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
4990: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
49a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
49b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
49c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
49d0: 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62  *xDestructor)(Db
49e0: 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43  Page*,int); /* C
49f0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
4a00: 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61   when freeing pa
4a10: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
4a20: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
4a30: 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61  e*,int);   /* Ca
4a40: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
4a50: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
4a60: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
4a70: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
4a80: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
4a90: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
4aa0: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
4ab0: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
4ac0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
4ad0: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
4ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4af0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4b00: 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69  Codec() */.#endi
4b10: 66 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20  f.  int nHash;  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
4b40: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4b50: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61  */.  PgHdr **aHa
4b60: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
4b70: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74   /* Hash table t
4b80: 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  o map page numbe
4b90: 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69  r to PgHdr */.#i
4ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4bb0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
4bc0: 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e  MENT.  Pager *pN
4bd0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
4be0: 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e     /* Doubly lin
4bf0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
4c00: 72 73 20 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20  rs on which */. 
4c10: 20 50 61 67 65 72 20 2a 70 50 72 65 76 3b 20 20   Pager *pPrev;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c30: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
4c40: 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f  memory() will wo
4c50: 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55  rk */.  int iInU
4c60: 73 65 4d 4d 3b 20 20 20 20 20 20 20 20 20 20 20  seMM;           
4c70: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
4c80: 69 66 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 74  if unavailable t
4c90: 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  o MM */.  int iI
4ca0: 6e 55 73 65 44 42 3b 20 20 20 20 20 20 20 20 20  nUseDB;         
4cb0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
4cc0: 6f 20 69 66 20 69 6e 20 73 71 6c 69 74 65 33 5f  o if in sqlite3_
4cd0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
4ce0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4cf0: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4d10: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4d20: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4d30: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
4d40: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
4d50: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
4d60: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
4d70: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
4d80: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
4d90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
4da0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
4db0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
4dc0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
4dd0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
4de0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
4df0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
4e00: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
4e10: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
4e20: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
4e30: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
4e40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4e50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
4e60: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
4e70: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4e80: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4e90: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
4ea0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4eb0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
4ec0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
4ed0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4ee0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
4ef0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4f00: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
4f10: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4f20: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
4f30: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
4f40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4f50: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
4f60: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4f70: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
4f80: 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66  s freed */.# def
4f90: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
4fa0: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
4fb0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4fc0: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (v).#endif../*.*
4fd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4fe0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
4ff0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
5000: 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c   double-linked l
5010: 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61  ist.** of all pa
5020: 67 65 72 73 20 74 68 61 74 20 61 72 65 20 65 6c  gers that are el
5030: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67 65 20  igible for page 
5040: 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68 65 0a  stealing by the.
5050: 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  ** sqlite3_relea
5060: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65  se_memory() inte
5070: 72 66 61 63 65 2e 20 20 41 63 63 65 73 73 20 74  rface.  Access t
5080: 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73 0a 2a  o this list is.*
5090: 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  * protected by t
50a0: 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  he SQLITE_MUTEX_
50b0: 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65  STATIC_MEM2 mute
50c0: 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  x..*/.#ifdef SQL
50d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
50e0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61  Y_MANAGEMENT.sta
50f0: 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c 69 74  tic Pager *sqlit
5100: 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 30 3b  e3PagerList = 0;
5110: 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c 72 75  .static PagerLru
5120: 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72 75 50  List sqlite3LruP
5130: 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c  ageList = {0, 0,
5140: 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   0};.#endif.../*
5150: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
5160: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
5170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
5180: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
5190: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
51a0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
51b0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
51c0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
51d0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
51e0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
51f0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
5200: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
5210: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
5220: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
5230: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
5240: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
5250: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
5260: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
5270: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
5280: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
5290: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
52a0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
52b0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
52c0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
52d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
52e0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
52f0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
5300: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
5310: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
5320: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
5330: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
5340: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
5350: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
5360: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
5370: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
5380: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
5390: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
53a0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
53b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
53c0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
53d0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
53e0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
53f0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
5400: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
5410: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
5420: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
5430: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
5440: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
5450: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
5460: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
5470: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
5480: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5490: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
54a0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
54b0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
54c0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
54d0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
54e0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
54f0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
5500: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
5510: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
5520: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
5530: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5540: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5550: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5560: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
5570: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
5580: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
5590: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
55a0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
55b0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
55c0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
55d0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
55e0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
55f0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
5600: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
5610: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
5620: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
5630: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5640: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5650: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5660: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
5680: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
5690: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
56a0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
56b0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
56c0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
56d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
56e0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
56f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
5700: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
5710: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
5720: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
5730: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5740: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5750: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5760: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5770: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5780: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5790: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
57a0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
57b0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
57c0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
57d0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
57e0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
57f0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
5800: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
5810: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
5820: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
5830: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5840: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5850: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5860: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5870: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5880: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5890: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
58a0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
58b0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
58c0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
58d0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
58e0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
58f0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5900: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5910: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5920: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5930: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5940: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5950: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5960: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5970: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5990: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
59a0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
59b0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
59c0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
59d0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
59e0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
59f0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
5a00: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
5a10: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
5a20: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
5a30: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5a40: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5a50: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5a60: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5a70: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5a80: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5a90: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5ab0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5ac0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5ad0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
5ae0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
5af0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
5b00: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
5b10: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
5b20: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5b30: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5b40: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5b50: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5b60: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5b70: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5b90: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5ba0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5bb0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5bc0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5bd0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5be0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5bf0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5c00: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5c10: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
5c20: 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29 20  he pagerEnter() 
5c30: 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28 29  and pagerLeave()
5c40: 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72   routines acquir
5c50: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a  e and release.**
5c60: 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68   a mutex on each
5c70: 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74   pager.  The mut
5c80: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 2e  ex is recursive.
5c90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
5ca0: 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65   special-purpose
5cb0: 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79   mutex.  It only
5cc0: 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c   provides mutual
5cd0: 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65   exclusion.** be
5ce0: 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65 20  tween the Btree 
5cf0: 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d  and the Memory M
5d00: 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65  anagement sqlite
5d10: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
5d20: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  ().** function. 
5d30: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65   It does not pre
5d40: 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  vent, for exampl
5d50: 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66 72  e, two Btrees fr
5d60: 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20  om accessing.** 
5d70: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 61  the same pager a
5d80: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5d90: 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d    Other general-
5da0: 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20  purpose mutexes 
5db0: 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  in.** the btree 
5dc0: 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61  layer handle tha
5dd0: 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64  t chore..*/.#ifd
5de0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5df0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
5e00: 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  NT.  static void
5e10: 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67 65   pagerEnter(Page
5e20: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5e30: 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66  nUseDB++;.    if
5e40: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26  ( p->iInUseMM &&
5e50: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20   p->iInUseDB==1 
5e60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5e70: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5e80: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5e90: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5ea0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5eb0: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
5ec0: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5ed0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5ee0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
5ef0: 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49  ex);.      p->iI
5f00: 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20  nUseDB = 1;.    
5f10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5f20: 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
5f30: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5f40: 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29  p->iInUseMM==0 )
5f50: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
5f60: 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50  oid pagerLeave(P
5f70: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5f80: 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20  >iInUseDB--;.   
5f90: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55   assert( p->iInU
5fa0: 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23  seDB>=0 );.  }.#
5fb0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
5fc0: 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65  gerEnter(X).# de
5fd0: 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28  fine pagerLeave(
5fe0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
5ff0: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6000: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6010: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61  linked list mana
6020: 67 65 64 20 62 79 20 73 74 72 75 63 74 75 72 65  ged by structure
6030: 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62  .** pList (pPg b
6040: 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20  ecomes the last 
6050: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73  entry in the lis
6060: 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63  t - the most rec
6070: 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e  ently .** used).
6080: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
6090: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
60a0: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
60b0: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a   or pPg->gfree,.
60c0: 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
60d0: 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62  whether pPg is b
60e0: 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
60f0: 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63  e pager-specific
6100: 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52   or.** global LR
6110: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6120: 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50  c void listAdd(P
6130: 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69  agerLruList *pLi
6140: 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b  st, PagerLruLink
6150: 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a   *pLink, PgHdr *
6160: 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70  pPg){.  pLink->p
6170: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e  Next = 0;.  pLin
6180: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74  k->pPrev = pList
6190: 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66  ->pLast;..#ifdef
61a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
61b0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
61c0: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
61d0: 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70  =&pPg->free || p
61e0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
61f0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  e);.  assert(pLi
6200: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20  nk==&pPg->gfree 
6210: 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74  || pList!=&sqlit
6220: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a  e3LruPageList);.
6230: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c  #endif..  if( pL
6240: 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20  ist->pLast ){.  
6250: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68    int iOff = (ch
6260: 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68  ar *)pLink - (ch
6270: 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61  ar *)pPg;.    Pa
6280: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73  gerLruLink *pLas
6290: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
62a0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
62b0: 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69  )pList->pLast)[i
62c0: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74  Off]);.    pLast
62d0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Link->pNext = pP
62e0: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
62f0: 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70  assert(!pList->p
6300: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  First);.    pLis
6310: 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  t->pFirst = pPg;
6320: 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70  .  }..  pList->p
6330: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66  Last = pPg;.  if
6340: 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  ( !pList->pFirst
6350: 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e  Synced && pPg->n
6360: 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20  eedSync==0 ){.  
6370: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53    pList->pFirstS
6380: 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d  ynced = pPg;.  }
6390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
63a0: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
63b0: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
63c0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
63d0: 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e  ted to by pList.
63e0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
63f0: 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69  pLink should poi
6400: 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67  nt to either pPg
6410: 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67  ->free or pPg->g
6420: 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20  free, depending 
6430: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70  .** on whether p
6440: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
6450: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
6460: 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61  pecific or globa
6470: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6480: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52  tatic void listR
6490: 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69  emove(PagerLruLi
64a0: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
64b0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
64c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
64d0: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
64e0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
64f0: 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53  *)pPg;..#ifdef S
6500: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6510: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6520: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
6530: 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69  pPg->free || pLi
6540: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29  nk==&pPg->gfree)
6550: 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  ;.  assert(pLink
6560: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c  ==&pPg->gfree ||
6570: 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33   pList!=&sqlite3
6580: 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65  LruPageList);.#e
6590: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d  ndif..  if( pPg=
65a0: 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29  =pList->pFirst )
65b0: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
65c0: 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  rst = pLink->pNe
65d0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  xt;.  }.  if( pP
65e0: 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20  g==pList->pLast 
65f0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c  ){.    pList->pL
6600: 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ast = pLink->pPr
6610: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
6620: 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ink->pPrev ){.  
6630: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6640: 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67  pPrevLink = (Pag
6650: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
6660: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65  u8 *)pLink->pPre
6670: 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  v)[iOff]);.    p
6680: 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  PrevLink->pNext 
6690: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
66a0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
66b0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61  >pNext ){.    Pa
66c0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78  gerLruLink *pNex
66d0: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
66e0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
66f0: 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69  )pLink->pNext)[i
6700: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74  Off]);.    pNext
6710: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Link->pPrev = pL
6720: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
6730: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6740: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
6750: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
6760: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLink->pNext;. 
6770: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
6780: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
6790: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
67a0: 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75   *pL = (PagerLru
67b0: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
67c0: 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  p)[iOff]);.     
67d0: 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a   p = pL->pNext;.
67e0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
67f0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6800: 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d  p;.  }..  pLink-
6810: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6820: 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pPrev = 0;.}../*
6830: 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50   .** Add page pP
6840: 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  g to the list of
6850: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6860: 74 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a  the pager. If .*
6870: 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  * memory-managem
6880: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6890: 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61 67  also add the pag
68a0: 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  e to the global 
68b0: 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65  .** list of free
68c0: 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
68d0: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64  c void lruListAd
68e0: 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
68f0: 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70   listAdd(&pPg->p
6900: 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67  Pager->lru, &pPg
6910: 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69  ->free, pPg);.#i
6920: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6930: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
6940: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d  MENT.  if( !pPg-
6950: 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
6960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
6970: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6980: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
6990: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
69a0: 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73  C_LRU));.    lis
69b0: 74 41 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75  tAdd(&sqlite3Lru
69c0: 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e  PageList, &pPg->
69d0: 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20  gfree, pPg);.   
69e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
69f0: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
6a00: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
6a10: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6a20: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ));.  }.#endif.}
6a30: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20  ../* .** Remove 
6a40: 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74 68  page pPg from th
6a50: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  e list of free p
6a60: 61 67 65 73 20 66 6f 72 20 74 68 65 20 61 73 73  ages for the ass
6a70: 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a 2a  ociated pager..*
6a80: 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61  * If memory-mana
6a90: 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65  gement is enable
6aa0: 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70  d, also remove p
6ab0: 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62  Pg from the glob
6ac0: 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72  al list.** of fr
6ad0: 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  ee pages..*/.sta
6ae0: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6af0: 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70 50  Remove(PgHdr *pP
6b00: 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65  g){.  listRemove
6b10: 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c  (&pPg->pPager->l
6b20: 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20  ru, &pPg->free, 
6b30: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
6b40: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6b50: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
6b60: 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d  f( !pPg->pPager-
6b70: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
6b80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6b90: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6ba0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6bb0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6bc0: 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28  .    listRemove(
6bd0: 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  &sqlite3LruPageL
6be0: 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65  ist, &pPg->gfree
6bf0: 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69  , pPg);.    sqli
6c00: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6c10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6c20: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6c30: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6c40: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
6c50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6c60: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  n is called just
6c70: 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64 53   after the needS
6c80: 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  ync flag has bee
6c90: 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f  n cleared.** fro
6ca0: 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61  m all pages mana
6cb0: 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28 75  ged by pPager (u
6cc0: 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74  sually because t
6cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
6ce0: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
6cf0: 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64   synced). It upd
6d00: 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72 2d  ates the pPager-
6d10: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6d20: 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e  d variable.** an
6d30: 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  d, if memory-man
6d40: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6d50: 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c  ed, the sqlite3L
6d60: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6d70: 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61  tSynced.** varia
6d80: 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61  ble also..*/.sta
6d90: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6da0: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 50  SetFirstSynced(P
6db0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6dc0: 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
6dd0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
6de0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
6df0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6e00: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6e10: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
6e20: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
6e30: 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
6e40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6e50: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
6e60: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
6e70: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6e80: 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71  ));.    for(p=sq
6e90: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6ea0: 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d  .pFirst; p && p-
6eb0: 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e  >needSync; p=p->
6ec0: 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20  gfree.pNext);.  
6ed0: 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67    assert(p==pPag
6ee0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
6ef0: 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74  nced || p==sqlit
6f00: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6f10: 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20  irstSynced);.   
6f20: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
6f30: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
6f40: 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65   = p;.    sqlite
6f50: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
6f60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6f70: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6f80: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d  TATIC_LRU));.  }
6f90: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6fa0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6fb0: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
6fc0: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
6fd0: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
6fe0: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
6ff0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
7000: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
7010: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
7020: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
7030: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
7040: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
7050: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
7060: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
7070: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
7080: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
7090: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
70a0: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
70b0: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
70c0: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
70d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
70e0: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
70f0: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
7100: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
7110: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
7120: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
7130: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
7140: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
7150: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
7160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7170: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7180: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
7190: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
71a0: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
71b0: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
71c0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
71d0: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
71e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
71f0: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
7200: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
7210: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
7220: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70 61  N-1))==0 );.  pa
7230: 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
7240: 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ;.  sqlite3Fault
7250: 42 65 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41  Benign(SQLITE_FA
7260: 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c  ULTINJECTOR_MALL
7270: 4f 43 2c 20 70 50 61 67 65 72 2d 3e 61 48 61 73  OC, pPager->aHas
7280: 68 21 3d 30 29 3b 0a 20 20 61 48 61 73 68 20 3d  h!=0);.  aHash =
7290: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
72a0: 72 6f 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  ro( sizeof(aHash
72b0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 73 71 6c 69  [0])*N );.  sqli
72c0: 74 65 33 46 61 75 6c 74 42 65 6e 69 67 6e 28 53  te3FaultBenign(S
72d0: 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43  QLITE_FAULTINJEC
72e0: 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20 30 29 3b 0a  TOR_MALLOC, 0);.
72f0: 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
7300: 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73  ger);.  if( aHas
7310: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
7320: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
7330: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
7340: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
7350: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7360: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
7370: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7380: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
7390: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
73a0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
73b0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
73c0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
73d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
73e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
73f0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
7400: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
7410: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
7420: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
7430: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
7440: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
7450: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7460: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
7470: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
7480: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
7490: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
74a0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
74b0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
74c0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
74d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
74e0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
74f0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
7500: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7510: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
7520: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
7530: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7540: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
7550: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
7560: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
7570: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
7580: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
7590: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
75a0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
75b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
75c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
75d0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
75e0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
75f0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
7600: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
7610: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
7620: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
7630: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
7640: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7650: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
7660: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
7670: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
7680: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
7690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
76a0: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
76b0: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
76c0: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
76d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
76e0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
76f0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
7700: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
7710: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
7720: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
7730: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
7740: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
7750: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
7760: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
7770: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
7780: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7790: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
77a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
77b0: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
77c0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
77d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
77e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
77f0: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
7800: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
7810: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
7820: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
7830: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
7840: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
7850: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
7860: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
7870: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
7880: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
7890: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
78a0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
78b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
78c0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
78d0: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
78e0: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
78f0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
7900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7910: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
7920: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7930: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
7940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7950: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
7960: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7970: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
7980: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
7990: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
79a0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
79b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
79c0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
79d0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
79e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
79f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7a00: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
7a10: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
7a20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
7a30: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
7a40: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
7a50: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
7a60: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
7a70: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
7a80: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
7a90: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
7aa0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
7ab0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
7ac0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
7ad0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
7ae0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
7af0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
7b00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7b10: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
7b20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7b30: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
7b40: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
7b50: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
7b60: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
7b70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7b80: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
7b90: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
7ba0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
7bb0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
7bc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7bd0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
7be0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
7bf0: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
7c00: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
7c10: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
7c20: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
7c30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7c40: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
7c50: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
7c60: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
7c70: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
7c80: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7c90: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
7ca0: 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73  ctor = sqlite3Os
7cb0: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
7cc0: 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
7cd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
7ce0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  }..  assert(SQLI
7cf0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
7d00: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
7d10: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7d20: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
7d30: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20  (65536>>8));..  
7d40: 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64  if( !fd->pMethod
7d50: 73 20 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45  s || (dc&(SQLITE
7d60: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e  _IOCAP_ATOMIC|(n
7d70: 50 61 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74  Page>>8))&&nSect
7d80: 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20  or<=nPage) ){.  
7d90: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
7da0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7db0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
7dc0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
7dd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
7de0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
7df0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
7e00: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
7e10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
7e20: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
7e30: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
7e40: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
7e50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7e60: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
7e70: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
7e80: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
7e90: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
7ea0: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
7eb0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
7ec0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7ed0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
7ee0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7ef0: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
7f00: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
7f10: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7f20: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
7f30: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
7f40: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
7f50: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
7f60: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
7f70: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
7f80: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
7f90: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
7fa0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
7fb0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
7fc0: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
7fd0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
7fe0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
7ff0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
8000: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
8010: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
8020: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
8030: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
8040: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
8050: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
8060: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
8070: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
8080: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
8090: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
80a0: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
80b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
80c0: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
80d0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
80e0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
80f0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
8100: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
8110: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a  o be replayed..*
8120: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8130: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8140: 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69   *pPager);.stati
8150: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
8160: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
8170: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
8180: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
8190: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
81a0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
81b0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
81c0: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
81d0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
81e0: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
81f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
8200: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
8210: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
8220: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
8230: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
8240: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
8250: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
8260: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
8270: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
8280: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
8290: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
82a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 70  AGER_UNLOCK && p
82b0: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
82c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
82d0: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
82e0: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
82f0: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
8300: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
8310: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
8320: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
8330: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
8340: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
8350: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
8360: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
8370: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
8380: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
8390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
83a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
83b0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
83c0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
83d0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
83e0: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
83f0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
8400: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
8410: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
8420: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
8430: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
8440: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
8450: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8460: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
8470: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
8480: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
8490: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
84a0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
84b0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
84c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
84d0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
84e0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
84f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
8500: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
8510: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
8520: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
8530: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
8540: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
8550: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
8560: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
8570: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
8580: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
8590: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
85c0: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
85d0: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
85e0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
85f0: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
8600: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
8610: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
8620: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8630: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
8640: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
8650: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
8660: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
8670: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
8680: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
8690: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
86a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
86b0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
86c0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
86d0: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
86e0: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
86f0: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
8700: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
8710: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
8720: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
8730: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
8740: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
8750: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
8760: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
8770: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
8780: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
8790: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
87a0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
87b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
87c0: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
87d0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
87e0: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
87f0: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
8800: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
8810: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
8820: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
8830: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
8840: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
8850: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8860: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
8870: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
8880: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
88a0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
88b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
88c0: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
88d0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
88e0: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
88f0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
8900: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
8910: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
8920: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
8930: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
8940: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
8950: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
8960: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
8970: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8980: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
8990: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
89a0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
89b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
89c0: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
89d0: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
89e0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
89f0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
8a00: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
8a10: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8a20: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
8a30: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
8a40: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
8a50: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8a60: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
8a70: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
8a80: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
8a90: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
8aa0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
8ac0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
8ad0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
8ae0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e  har *zMaster, in
8af0: 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  t nMaster){.  in
8b00: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
8b10: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8b20: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8b30: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8b40: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8b50: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8b60: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8b70: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
8b80: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
8b90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8ba0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
8bb0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8bc0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8bd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8be0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8bf0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8c00: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
8c10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8c20: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
8c30: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
8c40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8c50: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
8c60: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8c70: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
8c80: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
8c90: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8ca0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8cb0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8cc0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
8cd0: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
8ce0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
8cf0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8d00: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
8d10: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8d20: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d30: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
8d40: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
8d50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8d70: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
8d80: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
8d90: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
8da0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
8db0: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
8dc0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
8dd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
8de0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
8df0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m -= zMaster[i];
8e00: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
8e10: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
8e20: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
8e30: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
8e40: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8e50: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
8e60: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
8e70: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8e80: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
8e90: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
8ea0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
8eb0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
8ec0: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
8ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
8ee0: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
8ef0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
8f00: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
8f10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
8f20: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
8f30: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
8f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8f50: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
8f60: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
8f70: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
8f80: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
8f90: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
8fa0: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
8fb0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
8fc0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
8fd0: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
8fe0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
8ff0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
9000: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
9010: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
9020: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
9030: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
9040: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
9050: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90d0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
90e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
90f0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
9100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9110: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
9120: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9130: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
9140: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
9150: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
9160: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
9170: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
9180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9190: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
91a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
91b0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
91c0: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
91d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
91e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
91f0: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
9200: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
9210: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9220: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
9230: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9240: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
9250: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
9260: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
9270: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
9280: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
9290: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
92a0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
92b0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
92c0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
92d0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
92e0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
92f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9300: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
9310: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
9320: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
9330: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
9340: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
9350: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
9360: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
9370: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
9380: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
9390: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
93a0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
93b0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
93c0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
93d0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
93e0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
93f0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
9400: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
9410: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
9420: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9430: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
9440: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
9450: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
9460: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
9470: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
9480: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
9490: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
94a0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
94b0: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
94c0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
94d0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69  lMagic)+16];.  i
94e0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
94f0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
9500: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
9510: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
9520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9530: 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a  ff;.  }..  seekJ
9540: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
9550: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
9560: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
9570: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9580: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
9590: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
95a0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
95b0: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
95c0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
95d0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
95e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
95f0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
9600: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
9610: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
9620: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
9630: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
9640: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
9650: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
9660: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
9670: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
9680: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
9690: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
96a0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
96b0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
96c0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
96d0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
96e0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
96f0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
9700: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
9710: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
9720: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
9730: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
9740: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
9750: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
9760: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
9770: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
9780: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
9790: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
97a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
97b0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
97c0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
97d0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
97e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
97f0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
9800: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
9810: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
9820: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
9830: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
9840: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
9850: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
9860: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
9870: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
9880: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
9890: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
98a0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
98b0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
98c0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
98d0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
98e0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
98f0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
9900: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
9910: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
9920: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
9930: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
9940: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
9950: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
9960: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
9970: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
9980: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
9990: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
99b0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
99c0: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
99d0: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
99e0: 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20  >noSync) .   || 
99f0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
9a00: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
9a10: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
9a20: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
9a30: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
9a40: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9a50: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9a60: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
9a70: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
9a80: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
9a90: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9aa0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
9ab0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
9ac0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
9ad0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
9ae0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e  */ .  sqlite3Ran
9af0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9b00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9b10: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9b20: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9b30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9b40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9b50: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9b60: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9b70: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9b80: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9b90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9ba0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9bb0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
9bc0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
9bd0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
9be0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
9bf0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
9c00: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9c10: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9c20: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
9c30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
9c40: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  );.  IOTRACE(("J
9c50: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9c60: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73  r->journalHdr, s
9c80: 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29  izeof(zHeader)))
9c90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
9ca0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9cb0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
9cc0: 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 70 50 61  eof(zHeader),pPa
9cd0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9ce0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9cf0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
9d00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9d10: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
9d20: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
9d30: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
9d40: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
9d50: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
9d60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9d70: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9d80: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9d90: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
9da0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9db0: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
9dc0: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
9dd0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
9de0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
9df0: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
9e00: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9e10: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
9e20: 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   1, pPager->jour
9e30: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 7d 0a 20  nalOff-1);.  }. 
9e40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9e50: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9e60: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9e70: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9e80: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9e90: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9ea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
9eb0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
9ec0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9ed0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9ee0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9ef0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
9f00: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
9f10: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
9f20: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
9f30: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
9f40: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
9f50: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9f60: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
9f70: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
9f80: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
9f90: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
9fa0: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
9fb0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
9fc0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
9fd0: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
9fe0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
9ff0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a000: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a010: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a020: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a030: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a040: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a050: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a060: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a070: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a080: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a090: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a0a0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a0b0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a0c0: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a0d0: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a0e0: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a0f0: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a100: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a110: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a120: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a130: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a140: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a150: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a160: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a170: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a180: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a190: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a1a0: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a1b0: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a1c0: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a1d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a1e0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a1f0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a200: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a210: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a220: 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61  f;..  seekJourna
a230: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
a240: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
a250: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
a260: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
a270: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
a280: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a290: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e  _DONE;.  }.  jrn
a2a0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
a2b0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63  ournalOff;..  rc
a2c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a2d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
a2e0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
a2f0: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
a300: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a310: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
a320: 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  += sizeof(aMagic
a330: 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  );..  if( memcmp
a340: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
a350: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
a360: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
a370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a380: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
a390: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a3a0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a3b0: 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  f, pNRec);.  if(
a3c0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a3d0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
a3e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a3f0: 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61   jrnlOff+4, &pPa
a400: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
a410: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a420: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
a430: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a440: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38  ->jfd, jrnlOff+8
a450: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
a460: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a470: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
a480: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a490: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a4a0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a4b0: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
a4c0: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
a4d0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
a4e0: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
a4f0: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
a500: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a510: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a520: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a530: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
a540: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
a550: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
a560: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
a570: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
a580: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a590: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
a5a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
a5b0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
a5c0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a5d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a5e0: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
a5f0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a600: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a610: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
a620: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a630: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
a640: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
a650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a660: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a670: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a680: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a690: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a6a0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a6b0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a6c0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a6d0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a6e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a6f0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a700: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a710: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a720: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a730: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a740: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a750: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a760: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a770: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a780: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a790: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a7a0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a7b0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
a7c0: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
a7d0: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
a7e0: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
a7f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a800: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
a810: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
a820: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
a830: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
a840: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
a850: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a860: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a870: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a880: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a890: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a8a0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a8b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
a8c0: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
a8d0: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
a8e0: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
a8f0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
a900: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
a910: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
a920: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
a930: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
a940: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
a950: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
a960: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
a970: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
a980: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
a990: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
a9a0: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
a9b0: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
a9c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a9d0: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
a9e0: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
a9f0: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
aa00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
aa10: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
aa20: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
aa30: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
aa40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
aa50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
aa60: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
aa70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
aa80: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
aa90: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
aaa0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
aab0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
aac0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
aad0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
aae0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
aaf0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
ab00: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
ab10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
ab20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
ab30: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
ab40: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ab50: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
ab60: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
ab70: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
ab80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ab90: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
aba0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
abb0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
abc0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
abd0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
abe0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
abf0: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
ac00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ac10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ac20: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
ac30: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ac40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
ac50: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
ac60: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
ac70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ac80: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
ac90: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
aca0: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
acb0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
acc0: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
acd0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
ace0: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
acf0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ad00: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
ad10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ad20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
ad30: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
ad40: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
ad50: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
ad60: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
ad70: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65  er->noSync;.  re
ad80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ad90: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
ada0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
adb0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
adc0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
add0: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
ade0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
adf0: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
ae00: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
ae10: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
ae20: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
ae30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ae40: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
ae50: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ps the sqlite3Pa
ae60: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a  gerStmtCommit().
ae70: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
ae80: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
ae90: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
aea0: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
aeb0: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
aec0: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
aed0: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
aee0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
aef0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
af00: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
af10: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
af20: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
af30: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
af40: 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79  ger;.  PgHistory
af50: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
af60: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
af70: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
af80: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
af90: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  pHist->inStmt ){
afa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69  .    assert( pHi
afb0: 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  st->pPrevStmt==0
afc0: 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74   && pHist->pNext
afd0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Stmt==0 );.    i
afe0: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
aff0: 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f   ){.      PGHDR_
b000: 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e  TO_HIST(pPager->
b010: 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e  pStmt, pPager)->
b020: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
b030: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74  .    }.    pHist
b040: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
b050: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ager->pStmt;.   
b060: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b070: 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d   pPg;.    pHist-
b080: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
b090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b0a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b0b0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b0c0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
b0d0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b0e0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b0f0: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
b100: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b110: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b120: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b130: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b140: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
b150: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
b160: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b170: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
b180: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
b190: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
b1a0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
b1b0: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
b1c0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
b1d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b1e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
b1f0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b200: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
b210: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
b220: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
b230: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
b240: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
b250: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
b260: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
b270: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
b280: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
b290: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
b2a0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
b2b0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
b2c0: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
b2d0: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
b2e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b2f0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b300: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
b310: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
b320: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b330: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
b340: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
b350: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
b360: 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52  pNext){.    IOTR
b370: 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
b380: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
b390: 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
b3a0: 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
b3b0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
b3c0: 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78  count);.    pNex
b3d0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
b3e0: 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65  l;.    lruListRe
b3f0: 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73  move(pPg);.    s
b400: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d  qlite3_free(pPg-
b410: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  >pData);.    sql
b420: 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
b430: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70 50 61    }.  assert(pPa
b440: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
b450: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b460: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
b470: 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73  Synced==0);.  as
b480: 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
b490: 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50  .pLast==0);.  pP
b4a0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
b4b0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
b4c0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
b4d0: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70 50 61  Dirty = 0;.  pPa
b4e0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
b4f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b500: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
b510: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
b520: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   0;.  pPager->aH
b530: 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ash = 0;.  pPage
b540: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a  r->nRef = 0;.}..
b550: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b560: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
b570: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
b580: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
b590: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
b5a0: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
b5b0: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
b5c0: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
b5d0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
b5e0: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
b5f0: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
b600: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
b610: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
b620: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
b630: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
b640: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
b650: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
b660: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
b670: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
b680: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
b690: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
b6a0: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
b6b0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
b6c0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
b6d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b6e0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b6f0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
b700: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
b710: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
b720: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
b730: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 55 6e   ){.        osUn
b740: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
b750: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
b760: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
b770: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
b780: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
b790: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
b7a0: 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a 20 49  er))..      /* I
b7b0: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
b7c0: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
b7d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b7e0: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
b7f0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74  e.      ** trust
b800: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
b810: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
b820: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
b830: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
b840: 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20     ** cache can 
b850: 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64  be discarded and
b860: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
b870: 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a  safely cleared..
b880: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
b890: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
b8a0: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  de ){.        pP
b8b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
b8c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
b8d0: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
b8e0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
b8f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
b900: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
b910: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
b920: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
b930: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b940: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
b950: 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  InStmt);.       
b960: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
b970: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
b980: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
b990: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b9a0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
b9b0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
b9c0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
b9d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
b9e0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
b9f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ba00: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  _free(pPager->aI
ba10: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  nJournal);.     
ba20: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
ba30: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
ba40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
ba50: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
ba60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
ba70: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
ba80: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
ba90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
baa0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
bab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
bac0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
bad0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
bae0: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  open = 0;.      
baf0: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
bb00: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
bb10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
bb20: 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65   !MEMDB || pPage
bb30: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
bb40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
bb50: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
bb60: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
bb70: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
bb80: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
bb90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
bba0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
bbb0: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
bbc0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
bbd0: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
bbe0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
bbf0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
bc00: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
bc10: 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
bc20: 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20  ate, .** do not 
bc30: 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c  attempt the roll
bc40: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
bc50: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
bc60: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
bc70: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
bc80: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
bc90: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
bca0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
bcb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  ;.  if( p->errCo
bcc0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
bcd0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
bce0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
bcf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
bd00: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20  lback(p);.  }.  
bd10: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b  pager_unlock(p);
bd20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
bd30: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75  rCode || !p->jou
bd40: 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e  rnalOpen || (p->
bd50: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21  exclusiveMode&&!
bd60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29  p->journalOff) )
bd70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
bd80: 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74  rrCode || !p->st
bd90: 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63  mtOpen || p->exc
bda0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a  lusiveMode );.}.
bdb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
bdc0: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
bdd0: 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73  action.  A trans
bde0: 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
bdf0: 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43  by either.** a C
be00: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
be10: 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ACK..**.** When 
be20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
be30: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
be40: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
be50: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
be60: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
be70: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
be80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
be90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
bea0: 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  ill release.** t
beb0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
bec0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
bed0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
bee0: 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74  ts place if that
bef0: 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f   is.** the appro
bf00: 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20  priate thing to 
bf10: 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63  do.  Release loc
bf20: 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70  ks usually is ap
bf30: 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e  propriate,.** un
bf40: 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65  less we are in e
bf50: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
bf60: 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74  mode or unless t
bf70: 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d  his is a .** COM
bf80: 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72  MIT AND BEGIN or
bf90: 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45   ROLLBACK AND BE
bfa0: 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  GIN operation..*
bfb0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
bfc0: 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20   file is either 
bfd0: 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63  deleted or trunc
bfe0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ated..**.** TODO
bff0: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
c000: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
c010: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
c020: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
c030: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
c040: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
c050: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
c060: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
c070: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
c080: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
c090: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
c0a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c0b0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
c0c0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c0d0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
c0e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c0f0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d  _OK;.  int rc2 =
c100: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
c110: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c120: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
c130: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
c140: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
c150: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
c160: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
c170: 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
c180: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c190: 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61  stmtOpen && !pPa
c1a0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c1b0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
c1c0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c1d0: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
c1e0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
c1f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
c200: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
c210: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
c220: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
c230: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
c240: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
c250: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
c260: 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f  fd, 0))==SQLITE_
c270: 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70 50 61  OK ){;.      pPa
c280: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c290: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
c2a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
c2b0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
c2c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
c2d0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
c2e0: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
c2f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
c300: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
c310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c320: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
c330: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
c340: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
c350: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
c360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c370: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 20    sqlite3_free( 
c380: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c390: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
c3a0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
c3b0: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
c3c0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
c3d0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
c3e0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
c3f0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
c400: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
c410: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
c420: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
c430: 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52      pPg->alwaysR
c440: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66  ollback = 0;.#if
c450: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
c460: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
c470: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c480: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
c490: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
c4a0: 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
c4b0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
c4c0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
c4d0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
c4e0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
c4f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
c500: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
c510: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
c520: 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
c530: 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
c540: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d  er->useJournal==
c550: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
c560: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c570: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
c580: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
c590: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
c5a0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
c5b0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c5c0: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
c5d0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c5e0: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
c5f0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
c600: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
c610: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
c620: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
c630: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
c640: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
c650: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
c660: 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73  nc = 0;.  lruLis
c670: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
c680: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
c690: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
c6a0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
c6b0: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
c6c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
c6d0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
c6e0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
c6f0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
c700: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
c710: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
c720: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
c730: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
c740: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
c750: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
c760: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
c770: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
c780: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
c790: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
c7a0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
c7b0: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
c7c0: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
c7d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
c7e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
c7f0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
c800: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
c810: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
c820: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
c830: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
c840: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
c850: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
c860: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
c870: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
c880: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
c890: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
c8a0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
c8b0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
c8c0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
c8d0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
c8e0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
c8f0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
c900: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
c910: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
c920: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
c930: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
c940: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
c950: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
c960: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
c970: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
c980: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
c990: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
c9a0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
c9b0: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
c9c0: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
c9d0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
c9e0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
c9f0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
ca00: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
ca10: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
ca20: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
ca30: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
ca40: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
ca50: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
ca60: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
ca70: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
ca80: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
ca90: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
caa0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
cab0: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
cac0: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
cad0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
cae0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
caf0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
cb00: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
cb10: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
cb20: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
cb30: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
cb40: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
cb50: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
cb60: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
cb70: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
cb80: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
cb90: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
cba0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
cbb0: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
cbc0: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
cbd0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
cbe0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
cbf0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
cc00: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
cc10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
cc20: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
cc30: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
cc40: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
cc50: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
cc60: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
cc70: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
cc80: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
cc90: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
cca0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ccb0: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
ccc0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
ccd0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
cce0: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
ccf0: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
cd00: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
cd10: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
cd20: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
cd30: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
cd40: 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66   *jfd,.  i64 off
cd50: 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b  set,.  int useCk
cd60: 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sum.){.  int rc;
cd70: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
cda0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
cdb0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
cdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cdd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
cde0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
cdf0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
ce00: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
ce30: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
ce40: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
ce50: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
ce60: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
ce70: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
ce80: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
ce90: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
cea0: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
ceb0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
cec0: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
ced0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
cee0: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
cef0: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
cf00: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
cf10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
cf20: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
cf30: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
cf40: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
cf50: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
cf60: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
cf70: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
cf80: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
cf90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cfa0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
cfb0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
cfc0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
cfd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
cfe0: 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72  fset+4);.  if( r
cff0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d000: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
d010: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
d020: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
d030: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
d040: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
d050: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
d060: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
d070: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
d080: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
d090: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
d0a0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
d0b0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
d0c0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
d0d0: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
d0e0: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
d0f0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
d100: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
d110: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
d120: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
d130: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
d140: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
d150: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
d160: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
d170: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
d180: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
d190: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
d1a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d1b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
d1c0: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
d1d0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
d1e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d1f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
d200: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
d210: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
d220: 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e   offset+pPager->
d230: 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
d240: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
d250: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d260: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d270: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
d280: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
d290: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
d2a0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
d2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
d2d0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d2e0: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
d2f0: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
d300: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
d310: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
d320: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d330: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
d340: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
d350: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
d360: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
d370: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d380: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
d390: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
d3a0: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
d3b0: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
d3c0: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
d3d0: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
d3e0: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
d3f0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
d400: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
d410: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
d420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
d430: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d440: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
d450: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
d460: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
d470: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
d480: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
d490: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
d4a0: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
d4b0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
d4c0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d4d0: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
d4e0: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
d4f0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
d500: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
d510: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
d520: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
d530: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
d540: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
d550: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
d560: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
d570: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
d580: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
d590: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
d5a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
d5b0: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
d5c0: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
d5d0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
d5e0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
d5f0: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
d600: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
d610: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
d620: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
d630: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
d640: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
d650: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
d660: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
d670: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
d680: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
d690: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
d6a0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
d6b0: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
d6c0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
d6d0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
d6e0: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
d6f0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
d700: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
d710: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
d720: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
d730: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
d740: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
d750: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
d760: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
d770: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
d780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
d790: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
d7a0: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
d7b0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
d7c0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
d7d0: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
d7e0: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
d7f0: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
d800: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
d810: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
d820: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
d830: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
d840: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
d850: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
d860: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
d870: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
d880: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
d890: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
d8a0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
d8b0: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
d8c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
d8d0: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
d8e0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
d8f0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
d900: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
d910: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
d920: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
d930: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
d940: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
d950: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
d960: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
d970: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
d980: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
d990: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
d9a0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
d9b0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52  , pgno);.  PAGER
d9c0: 54 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b  TRACE4("PLAYBACK
d9d0: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
d9e0: 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
d9f0: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
da00: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
da10: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
da20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
da30: 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28  , aData));.  if(
da40: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
da50: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
da60: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
da70: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
da80: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
da90: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
daa0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
dab0: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
dac0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
dad0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
dae0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
daf0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66   offset);.    if
db00: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d  ( pPg ){.      m
db10: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
db20: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
db30: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
db40: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
db50: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
db60: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
db70: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
db80: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
db90: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
dba0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
dbb0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
dbc0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
dbd0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
dbe0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
dbf0: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
dc00: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
dc10: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
dc20: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
dc30: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
dc40: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
dc50: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
dc60: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
dc70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
dc80: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
dc90: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
dca0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
dcb0: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
dcc0: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
dcd0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
dce0: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
dcf0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
dd00: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
dd10: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
dd20: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
dd30: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
dd40: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
dd50: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
dd60: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
dd70: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
dd80: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
dd90: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
dda0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
ddb0: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
ddc0: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
ddd0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
dde0: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
ddf0: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
de00: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
de10: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
de20: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
de30: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
de40: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
de50: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
de60: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
de70: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
de80: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
de90: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
dea0: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
deb0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
dec0: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
ded0: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
dee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
def0: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
df00: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
df10: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
df20: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
df30: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
df40: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
df50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
df60: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
df70: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
df80: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
df90: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
dfa0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
dfb0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
dfc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
dfd0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
dfe0: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
dff0: 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
e000: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
e010: 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
e020: 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
e030: 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
e040: 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
e050: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
e060: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  **.**.** The mas
e070: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e080: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
e090: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
e0a0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
e0b0: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
e0c0: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
e0d0: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
e0e0: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
e0f0: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
e100: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
e110: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
e120: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
e130: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
e140: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
e150: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
e160: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
e170: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
e180: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
e190: 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
e1a0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
e1b0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
e1c0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
e1d0: 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
e1e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
e1f0: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
e200: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  0;.  sqlite3_fil
e210: 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71  e *pMaster;.  sq
e220: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
e230: 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  rnal;.  char *zM
e240: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
e250: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
e260: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e270: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
e280: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
e290: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
e2a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e2b0: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
e2c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e2d0: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
e2e0: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
e2f0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
e300: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
e310: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
e320: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
e330: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
e340: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
e350: 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
e360: 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
e370: 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e  e3_malloc(pVfs->
e380: 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
e390: 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
e3a0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
e3b0: 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
e3c0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
e3d0: 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
e3e0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e3f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
e400: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
e410: 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
e420: 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
e430: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
e440: 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
e450: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
e460: 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
e470: 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
e480: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
e490: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
e4a0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
e4b0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
e4c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
e4d0: 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
e4e0: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
e4f0: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
e500: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e510: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
e520: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
e530: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
e540: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
e550: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
e560: 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
e570: 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61  nMasterPtr = pPa
e580: 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
e590: 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a  hname+1;..    /*
e5a0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
e5b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e5c0: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
e5d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
e5e0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
e5f0: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
e600: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
e610: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
e620: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
e630: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
e640: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73  ite3_malloc(nMas
e650: 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
e660: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66  sterPtr);.    if
e670: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
e680: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
e690: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e6a0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
e6b0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
e6c0: 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
e6d0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
e6e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a  MasterJournal];.
e6f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e700: 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
e710: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
e720: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
e730: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
e740: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
e750: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
e760: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
e770: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
e780: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
e790: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
e7a0: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
e7b0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
e7c0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
e7d0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
e7e0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
e7f0: 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20 20  XISTS) ){.      
e800: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
e810: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
e820: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
e830: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
e840: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
e850: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
e860: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
e870: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e880: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
e890: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
e8a0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
e8b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e8c0: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
e8d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
e8e0: 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
e8f0: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
e900: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
e910: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
e920: 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  AL);.        rc 
e930: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
e940: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
e950: 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
e960: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
e970: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e980: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
e990: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
e9a0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
e9b0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
e9c0: 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e  erJournal(pJourn
e9d0: 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20  al, zMasterPtr, 
e9e0: 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
e9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
ea00: 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ose(pJournal);. 
ea10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
ea20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
ea40: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ea50: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d    }..        c =
ea60: 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
ea70: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
ea80: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
ea90: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ==0;.        if(
eaa0: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
eab0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
eac0: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
ead0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
eae0: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
eaf0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
eb00: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
eb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
eb20: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
eb30: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
eb40: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
eb50: 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
eb60: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
eb70: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
eb80: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
eb90: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
eba0: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
ebb0: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
ebc0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
ebd0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
ebe0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
ebf0: 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
ec00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
ec10: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
ec20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
ec30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
ec40: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
ec50: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f  ger *pPager);../
ec60: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
ec70: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
ec80: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
ec90: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
eca0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
ecb0: 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74  ed. Also truncat
ecc0: 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70  e the cached rep
ecd0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
ece0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d  he file..**.** M
ecf0: 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
ed00: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
ed10: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
ed20: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61  smaller than nPa
ed30: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  ge..** This can 
ed40: 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d  happen, for exam
ed50: 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69  ple, if we are i
ed60: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20  n the middle of 
ed70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
ed80: 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e   which has exten
ed90: 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ded the file siz
eda0: 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61  e and the new pa
edb0: 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c  ges are still al
edc0: 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63  l held.** in cac
edd0: 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45  he, then an INSE
ede0: 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65  RT or UPDATE doe
edf0: 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  s a statement ro
ee00: 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a  llback.  Some.**
ee10: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
ee20: 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
ee30: 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
ee40: 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f  ed if you try to
ee50: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66  .** truncate a f
ee60: 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
ee70: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
ee80: 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c  than it currentl
ee90: 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65  y is,.** so dete
eea0: 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
eeb0: 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74   do not do the t
eec0: 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  runcation..*/.st
eed0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
eee0: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
eef0: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
ef00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ef10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
ef20: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
ef30: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
ef40: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
ef50: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34  thods ){.    i64
ef60: 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
ef70: 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  wSize;.    rc = 
ef80: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
ef90: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
efa0: 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
efb0: 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
efc0: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
efd0: 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
efe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
eff0: 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
f000: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
f010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
f020: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
f030: 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 7d   newSize);.    }
f040: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
f050: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f060: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
f070: 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
f080: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
f090: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
f0a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f0b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74  .** Set the sect
f0c0: 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67  orSize for the g
f0d0: 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a  iven pager..**.*
f0e0: 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  * The sector siz
f0f0: 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72 20  e is the larger 
f100: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  of the sector si
f110: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
f120: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
f130: 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20  rSize() and the 
f140: 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  pageSize..*/.sta
f150: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
f160: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
f170: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
f180: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
f190: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
f1a0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
f1b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f1c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
f1d0: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
f1e0: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
f1f0: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
f200: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
f210: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
f220: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
f230: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
f240: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
f250: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
f260: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
f270: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
f280: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f290: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
f2a0: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
f2b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
f2c0: 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d  ctorSize<pPager-
f2d0: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
f2e0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
f2f0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
f300: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f  geSize;.  }.}../
f310: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
f320: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
f330: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
f340: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
f350: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
f360: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
f370: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
f380: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
f390: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
f3a0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
f3b0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
f3c0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
f3d0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
f3e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
f3f0: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
f400: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
f410: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
f420: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
f430: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
f440: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
f450: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
f460: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
f470: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
f480: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
f490: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
f4a0: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
f4b0: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
f4c0: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
f4d0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
f4e0: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
f4f0: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
f500: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
f510: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
f520: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
f530: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f540: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
f550: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
f560: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
f570: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
f580: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
f590: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
f5a0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
f5b0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
f5c0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
f5d0: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
f5e0: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
f5f0: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
f600: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
f610: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
f620: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
f630: 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73  **  (6)  N bytes
f640: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
f650: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
f660: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
f670: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
f680: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
f690: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
f6a0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
f6b0: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
f6c0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
f6d0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
f6e0: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
f6f0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
f700: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
f710: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
f720: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
f730: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
f740: 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f  .**  (7)  Zero o
f750: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
f760: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
f770: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
f780: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
f790: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
f7a0: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
f7b0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
f7c0: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
f7d0: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
f7e0: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
f7f0: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
f800: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
f810: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
f820: 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   6 items above..
f830: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
f840: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
f850: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
f860: 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 7th item..**.
f870: 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
f880: 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
f890: 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
f8a0: 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
f8b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
f8c0: 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
f8d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
f8e0: 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
f8f0: 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
f900: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
f910: 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
f920: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f930: 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
f940: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
f950: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
f960: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
f970: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
f980: 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
f990: 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
f9a0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
f9b0: 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
f9c0: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
f9d0: 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
f9e0: 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
f9f0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
fa00: 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
fa10: 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
fa20: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
fa30: 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
fa40: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
fa50: 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
fa60: 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
fa70: 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
fa80: 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
fa90: 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
faa0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
fab0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
fac0: 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
fad0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
fae0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
faf0: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
fb00: 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
fb10: 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
fb20: 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
fb30: 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
fb40: 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
fb50: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
fb60: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
fb70: 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
fb80: 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
fb90: 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
fba0: 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
fbb0: 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
fbc0: 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
fbd0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
fbe0: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
fbf0: 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
fc00: 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
fc10: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
fc20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
fc30: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
fc40: 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
fc50: 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
fc60: 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
fc70: 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
fc80: 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
fc90: 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
fca0: 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
fcb0: 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
fcc0: 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
fcd0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
fce0: 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
fcf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
fd00: 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
fd10: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
fd20: 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
fd30: 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
fd40: 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
fd50: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
fd60: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
fd70: 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
fd80: 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
fd90: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
fda0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fdb0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
fdc0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
fdd0: 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
fde0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
fdf0: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
fe00: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
fe10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fe20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fe30: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
fe40: 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fe60: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
fe70: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
fe80: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fea0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
feb0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
fec0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
fed0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
fee0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
fef0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
ff20: 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
ff30: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
ff40: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
ff50: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
ff60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
ff70: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
ff80: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
ff90: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
ffa0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
ffb0: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
ffc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
ffd0: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
ffe0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
fff0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
10000 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10010 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
10020 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
10030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
10040 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
10050 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10060 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
10070 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10080 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
10090 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
100a0 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
100b0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
100c0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
100d0 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
100e0 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
100f0 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
10100 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
10110 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
10120 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
10130 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
10140 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
10150 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
10160 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10170 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
10180 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
10190 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
101a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
101b0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
101c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
101d0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
101e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc!=SQLITE_OK .
101f0 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30     || (zMaster[0
10200 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 41  ] && !sqlite3OsA
10210 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
10220 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
10230 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20 20 29  SS_EXISTS)) .  )
10240 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
10250 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
10260 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
10270 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10280 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10290 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
102a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
102b0 3b 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ;.  zMaster = 0;
102c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
102d0 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
102e0 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
102f0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
10300 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
10310 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
10320 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10330 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
10340 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
10350 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
10360 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
10370 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
10380 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
10390 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
103a0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
103b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
103c0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
103d0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
103e0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
103f0 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
10400 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
10410 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
10420 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
10430 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
10440 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
10450 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
10460 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
10470 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
10480 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
10490 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
104a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
104b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
104c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
104d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
104e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
104f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10500 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
10510 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
10520 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
10530 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10540 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
10550 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
10560 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
10570 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
10580 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
10590 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
105a0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
105b0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
105c0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
105d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
105e0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
105f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
10600 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
10610 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
10620 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
10630 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
10640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
10650 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
10660 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
10670 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
10680 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
10690 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
106a0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
106b0 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
106c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
106d0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
106e0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
106f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
10700 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
10710 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
10720 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
10730 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
10740 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
10750 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
10760 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
10770 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10780 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
10790 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
107a0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
107b0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
107c0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
107d0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
107e0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
107f0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
10800 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
10810 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
10820 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
10830 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
10840 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
10850 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  5..    */.    if
10860 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
10870 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
10880 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
10890 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
108a0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
108b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
108c0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
108d0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
108e0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
108f0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
10900 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10910 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
10920 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
10930 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10940 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
10950 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
10960 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
10970 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
10980 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
10990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
109a0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
109b0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
109c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
109d0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
109e0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
109f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10a00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
10a10 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
10a20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10a30 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
10a40 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
10a50 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
10a60 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
10a70 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
10a80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10a90 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
10aa0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
10ab0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
10ac0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
10ad0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
10ae0 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20  alOff, 1);.     
10af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
10b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
10b20 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
10b30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10b40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
10b50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
10b60 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
10b70 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
10b80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  e{.          got
10b90 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10ba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10bb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
10bc0 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
10bd0 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
10be0 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
10bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10c00 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
10c10 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10c20 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
10c30 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
10c40 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
10c50 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
10c60 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
10c70 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
10c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10c90 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
10ca0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
10cb0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
10cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
10cd0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
10ce0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
10cf0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10d00 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
10d10 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
10d20 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
10d30 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
10d40 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
10d50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10d60 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
10d70 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
10d80 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
10d90 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
10da0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
10db0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
10dc0 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
10dd0 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
10de0 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
10df0 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
10e00 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
10e10 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
10e20 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
10e30 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
10e40 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
10e50 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
10e60 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
10e70 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
10e80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10e90 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
10ea0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
10eb0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
10ec0 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
10ed0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
10ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
10ef0 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
10f00 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
10f10 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
10f20 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
10f30 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
10f40 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
10f50 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
10f60 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
10f70 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
10f80 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
10f90 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
10fa0 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
10fb0 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
10fc0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
10fd0 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
10fe0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
10ff0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
11000 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
11010 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
11020 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
11030 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
11040 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
11050 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
11060 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
11070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11080 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
11090 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
110a0 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
110c0 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
110d0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
110e0 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  4 hdrOff;.  int 
110f0 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
11100 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11110 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
11120 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11130 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11140 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
11150 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
11160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11170 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
11180 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73   .  {.    i64 os
11190 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73  _szJ;.    rc = s
111a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
111b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  (pPager->jfd, &o
111c0 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
111d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
111e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
111f0 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
11200 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
11210 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
11220 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
11230 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  et just after th
11240 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73  e end of the las
11250 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70  t journal.  ** p
11260 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  age written befo
11270 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  re the first jou
11280 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20  rnal-header for 
11290 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20  this statement. 
112a0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
112b0 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20  was written, or 
112c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
112d0 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
112e0 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
112f0 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
11300 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
11310 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
11320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11330 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
11340 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
11350 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
11360 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
11370 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20   .  /* Truncate 
11380 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
11390 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
113a0 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
113b0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
113c0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
113d0 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
113e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
113f0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
11400 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  RED );..  /* Fig
11410 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
11420 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
11430 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
11440 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
11450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11460 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
11470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11480 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65  ;.  nRec = pPage
11490 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a  r->stmtNRec;.  .
114a0 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
114b0 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
114c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
114d0 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
114e0 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
114f0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
11500 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
11510 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69  ment journal omi
11520 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f  ts checksums fro
11530 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f  m.  ** each reco
11540 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66  rd since power-f
11550 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20  ailure recovery 
11560 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74  is not important
11570 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20   to statement.  
11580 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a  ** journals..  *
11590 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
115a0 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Rec; i++){.    i
115b0 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34  64 offset = i*(4
115c0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
115d0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  e);.    rc = pag
115e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
115f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
11600 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65  ger->stfd, offse
11610 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  t, 0);.    asser
11620 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
11630 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
11640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11650 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
11660 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
11670 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61  Now roll some pa
11680 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ges back from th
11690 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
116a0 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d  urnal. Pager.stm
116b0 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20  tJSize.  ** was 
116c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
116d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
116e0 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
116f0 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f   was started, so
11700 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  .  ** everything
11710 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64   after that need
11720 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
11730 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f  ack, either into
11740 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
11750 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  se, the memory c
11760 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20  ache, or both.. 
11770 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69   **.  ** If it i
11780 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
11790 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66   Pager.stmtHdrOf
117a0 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  f is the offset 
117b0 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
117c0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a  * of the first j
117d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
117e0 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69  itten during thi
117f0 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
11800 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
11810 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11820 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
11830 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
11840 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
11850 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
11860 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
11870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68  ->journalOff < h
11880 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20  drOff ){.    rc 
11890 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
118a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
118b0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
118c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
118d0 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  f, 1);.    asser
118e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
118f0 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
11900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11910 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
11920 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  back;.  }..  whi
11930 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
11940 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a  nalOff < szJ ){.
11950 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20      u32 nJRec;  
11960 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11970 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
11980 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
11990 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
119a0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
119b0 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
119c0 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
119d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
119e0 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
119f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
11a00 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
11a10 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
11a20 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
11a30 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20  ( nJRec==0 ){.  
11a40 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a      nJRec = (szJ
11a50 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
11a60 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
11a70 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
11a80 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
11a90 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  JRec-1; i>=0 && 
11aa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11ab0 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
11ac0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
11ad0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
11ae0 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
11af0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
11b00 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
11b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11b20 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
11b30 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11b40 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
11b50 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
11b60 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
11b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11b80 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64  ff = szJ;.  .end
11b90 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _stmt_playback:.
11ba0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11bb0 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65  _OK) {.    pPage
11bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
11bd0 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65  szJ;.    /* page
11be0 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
11bf0 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20  Pager); */.  }. 
11c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11c10 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
11c20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
11c30 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
11c40 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
11c50 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
11c60 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11c70 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
11c80 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
11c90 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
11ca0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11cb0 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
11cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
11cd0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
11ce0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
11cf0 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
11d00 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
11d10 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
11d20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
11d30 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
11d40 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
11d50 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
11d60 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
11d70 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
11d80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
11d90 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
11da0 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
11db0 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
11dc0 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
11dd0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
11de0 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
11df0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11e00 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
11e10 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
11e20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
11e30 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
11e40 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
11e50 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
11e60 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
11e80 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
11e90 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
11ea0 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
11eb0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
11ec0 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
11ed0 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
11ee0 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
11ef0 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
11f00 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
11f10 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
11f20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
11f30 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
11f40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11f50 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
11f60 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
11f70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
11f80 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
11f90 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
11fa0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
11fb0 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
11fc0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
11fd0 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
11fe0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
11ff0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
12000 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
12010 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
12020 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
12030 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
12040 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
12050 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
12060 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
12070 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
12080 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
12090 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
120a0 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
120b0 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
120c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
120d0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
120e0 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
120f0 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
12100 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
12110 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
12120 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
12130 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
12140 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
12160 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
12170 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
12180 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
12190 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
121a0 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
121b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
121c0 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
121d0 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
121e0 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
121f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12200 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
12210 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
12220 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
12230 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
12240 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
12250 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20   full_fsync){.  
12260 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
12270 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
12280 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
12290 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
122a0 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
122b0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
122c0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  le;.  pPager->sy
122d0 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c  nc_flags = (full
122e0 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  _fsync?SQLITE_SY
122f0 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
12300 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
12310 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
12320 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
12330 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
12340 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
12350 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
12360 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
12370 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
12380 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
12390 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
123a0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
123b0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
123c0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
123d0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
123e0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
123f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
12400 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
12410 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
12420 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
12430 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
12440 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rary file. .**.*
12450 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
12460 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
12470 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
12480 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
12490 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
124a0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
124b0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
124c0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
124d0 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
124e0 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
124f0 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
12500 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
12510 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
12520 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74  pentemp(.  sqlit
12530 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
12540 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
12550 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79 65  file system laye
12560 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
12570 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
12580 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
12590 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
125a0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
125b0 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ame,      /* Nam
125c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20  e of the file.  
125d0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
125e0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
125f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
12600 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
12610 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
12620 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
12630 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21  sert( zFilename!
12640 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
12650 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
12660 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
12670 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
12680 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
12690 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
126a0 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
126b0 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
126c0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
126d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
126e0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
126f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
12700 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
12710 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
12720 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
12730 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46  3OsOpen(pVfs, zF
12740 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c 20  ilename, pFile, 
12750 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
12760 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
12770 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  TE_OK || pFile->
12780 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65  pMethods );.  re
12790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
127a0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
127b0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75  age cache and pu
127c0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
127d0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e  he page cache in
127e0 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68   *ppPager..** Th
127f0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
12800 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69  hed need not exi
12810 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73  st.  The file is
12820 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69   not locked unti
12830 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  l.** the first c
12840 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
12850 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20  gerGet() and is 
12860 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
12870 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
12880 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
12890 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
128a0 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a  agerUnref()..**.
128b0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
128c0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
128d0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
128e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
128f0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
12900 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
12910 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54  to be cached.  T
12920 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
12930 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
12940 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74  atically when it
12950 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
12960 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
12970 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
12980 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  n all informatio
12990 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
129a0 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76  he..** It is nev
129b0 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
129c0 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  sk.  This can be
129d0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
129e0 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  nt an.** in-memo
129f0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ry database..*/.
12a00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12a10 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
12a20 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
12a30 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
12a40 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
12a50 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
12a60 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
12a70 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
12a80 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
12a90 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
12aa0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12ab0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
12ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
12ad0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
12ae0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
12af0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
12b00 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
12b10 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
12b20 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
12b30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12b40 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
12b50 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
12b60 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b80 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
12b90 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
12ba0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
12bb0 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
12bc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
12bd0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
12be0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
12bf0 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
12c00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
12c10 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
12c20 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
12c30 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
12c40 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
12c50 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
12c60 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
12c70 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
12c80 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
12c90 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  ;.  int journalF
12ca0 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
12cb0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
12cc0 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75  s);.  int nDefau
12cd0 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f  ltPage = SQLITE_
12ce0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
12cf0 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  E;.  char *zPath
12d00 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74  name;.  int nPat
12d10 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54 68 65  hname;..  /* The
12d20 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20   default return 
12d30 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
12d40 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  r */.  *ppPager 
12d50 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
12d60 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  te the full path
12d70 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e  name */.  nPathn
12d80 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
12d90 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74  thname+1;.  zPat
12da0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  hname = sqlite3_
12db0 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  malloc(nPathname
12dc0 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  );.  if( zPathna
12dd0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
12de0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
12e00 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
12e10 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
12e20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
12e30 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
12e40 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
12e50 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
12e60 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
12e70 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
12e80 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
12e90 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
12ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12eb0 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
12ec0 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
12ed0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
12ee0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
12ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
12f00 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65  = sqlite3OsGetTe
12f10 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50 61  mpname(pVfs, nPa
12f20 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
12f30 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
12f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12f50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12f60 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
12f70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12f80 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72   nPathname = str
12f90 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  len(zPathname);.
12fa0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
12fb0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
12fc0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
12fd0 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
12fe0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
12ff0 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
13000 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
13010 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
13020 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
13030 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20  FileSize +      
13040 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
13050 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75  nal file structu
13060 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d  re */ .    pVfs-
13070 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20 2b 20  >szOsFile * 2 + 
13080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 62         /* The db
13090 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72 6e 61   and stmt journa
130a0 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
130b0 34 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30  4*nPathname + 40
130c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
130d0 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63  Filename, zDirec
130e0 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  tory, zJournal, 
130f0 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29  zStmtJrnl */.  )
13100 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  ;.  if( !pPager 
13110 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13120 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13140 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
13150 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61  Ptr = (u8 *)&pPa
13160 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
13170 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
13180 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d  Flags;.  pPager-
13190 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  >fd = (sqlite3_f
131a0 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
131b0 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20  >szOsFile*0];.  
131c0 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20 28  pPager->stfd = (
131d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
131e0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
131f0 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*1];.  pPager-
13200 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  >jfd = (sqlite3_
13210 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
13220 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20  ->szOsFile*2];. 
13230 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13240 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74  me = (char*)&pPt
13250 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
13260 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  *2+journalFileSi
13270 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze];.  pPager->z
13280 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
13290 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
132a0 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
132b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
132c0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
132d0 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b  ctory[nPathname+
132e0 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 53  1];.  pPager->zS
132f0 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61 67 65  tmtJrnl = &pPage
13300 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
13310 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70 50 61  hname+10];.  pPa
13320 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
13330 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  ;.  memcpy(pPage
13340 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
13350 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
13360 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  me+1);.  sqlite3
13370 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
13380 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
13390 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
133a0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
133b0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
133c0 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
133d0 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65     if( nPathname
133e0 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  >(pVfs->mxPathna
133f0 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f  me - sizeof("-jo
13400 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20  urnal")) ){.    
13410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
13420 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73  NTOPEN;.    }els
13430 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75  e{.      int fou
13440 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
13450 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
13460 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
13470 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
13480 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >fd,.           
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
134a0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20  ager->vfsFlags, 
134b0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  &fout);.      re
134c0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
134d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
134e0 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NLY);..      /* 
134f0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
13500 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
13510 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
13520 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20  te access,.     
13530 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
13540 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
13550 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
13560 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
13570 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
13580 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
13590 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
135a0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
135b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
135c0 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
135d0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
135e0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
135f0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
13600 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
13610 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a  orSize().      *
13620 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
13630 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
13640 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
13650 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
13660 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13680 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
13690 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f        int iSecto
136a0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
136b0 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
136c0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
136d0 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67   if( nDefaultPag
136e0 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b  e<iSectorSize ){
136f0 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61  .          nDefa
13700 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74 6f  ultPage = iSecto
13710 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
13720 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13730 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
13740 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
13750 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
13760 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
13770 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
13780 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
13790 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
137a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
137b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
137c0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
137d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
137e0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
137f0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
13800 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
13810 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
13820 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
13830 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
13840 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
13850 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20 69  =nDefaultPage; i
13860 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
13870 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13880 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
13890 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
138a0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
138b0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e  MIC|(ii>>8)) ) n
138c0 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69 69  DefaultPage = ii
138d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
138e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
138f0 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61         if( nDefa
13900 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d  ultPage>SQLITE_M
13910 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
13920 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
13930 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d    nDefaultPage =
13940 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
13950 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
13960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13970 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
13980 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
13990 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
139a0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
139b0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
139c0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
139d0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
139e0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
139f0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
13a00 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
13a10 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
13a20 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
13a30 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
13a40 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
13a50 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  te()..    */ .  
13a60 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
13a70 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13a80 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
13a90 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  IVE;.  }..  if( 
13aa0 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51  pPager && rc==SQ
13ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
13ac0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
13ad0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
13ae0 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66 61 75  e3_malloc(nDefau
13af0 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ltPage);.  }..  
13b00 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
13b10 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
13b20 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
13b30 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20  bove..  ** Free 
13b40 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
13b50 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
13b60 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e  e file..  ** Sin
13b70 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
13b80 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
13b90 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
13ba0 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
13bb0 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
13bc0 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
13bd0 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
13be0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
13bf0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13c00 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13c10 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
13c20 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
13c30 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
13c40 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54  SQLITE_OK)?SQLIT
13c50 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d  E_NOMEM:rc);.  }
13c60 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  ..  PAGERTRACE3(
13c70 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
13c80 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
13c90 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
13ca0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
13cb0 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
13cc0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
13cd0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13ce0 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  me))..  /* Fill 
13cf0 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  in Pager.zDirect
13d00 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  ory[] */.  memcp
13d10 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
13d20 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46  tory, pPager->zF
13d30 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
13d40 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73  me+1);.  for(i=s
13d50 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44  trlen(pPager->zD
13d60 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30 20 26  irectory); i>0 &
13d70 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
13d80 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
13d90 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
13da0 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
13db0 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
13dc0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
13dd0 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 61  ger.zJournal[] a
13de0 6e 64 20 50 61 67 65 72 2e 7a 53 74 6d 74 4a 72  nd Pager.zStmtJr
13df0 6e 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  nl[] */.  memcpy
13e00 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
13e10 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  l, pPager->zFile
13e20 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
13e30 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67  ;.  memcpy(&pPag
13e40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
13e50 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
13e60 61 6c 22 2c 20 39 29 3b 0a 20 20 6d 65 6d 63 70  al", 9);.  memcp
13e70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a  y(pPager->zStmtJ
13e80 72 6e 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  rnl, pPager->zFi
13e90 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
13ea0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
13eb0 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 5b  ager->zStmtJrnl[
13ec0 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 73 74  nPathname], "-st
13ed0 6d 74 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a 0a 20  mtjrnl", 10);.. 
13ee0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
13ef0 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
13f00 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
13f10 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
13f20 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
13f30 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
13f40 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
13f50 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
13f60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
13f70 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
13f80 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
13f90 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
13fa0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
13fb0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
13fc0 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
13fd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13fe0 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67 65  e = nDefaultPage
13ff0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
14000 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
14010 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
14020 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
14030 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
14040 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
14050 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
14060 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  ;.  pPager->mxPg
14070 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
14080 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
14090 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
140a0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
140b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
140c0 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
140d0 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
140e0 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
140f0 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
14100 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14110 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
14120 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
14130 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
14140 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
14150 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
14160 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
14170 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
14180 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
14190 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
141a0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
141b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
141c0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
141d0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
141e0 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
141f0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
14200 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
14210 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
14220 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
14230 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
14240 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
14250 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
14260 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
14270 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
14280 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
14290 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
142a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
142b0 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
142c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
142d0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
142e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
142f0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
14300 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
14310 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
14320 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
14330 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
14340 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
14350 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
14360 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
14370 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65  |memDb||tempFile
14380 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
14390 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72  ){.    setSector
143a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
143b0 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
143c0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
143d0 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
143e0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
143f0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
14400 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
14410 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
14420 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14430 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
14440 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
14450 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
14460 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
14470 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  eDB = 0;.  if( !
14480 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  memDb ){.    sql
14490 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
144a0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
144b0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
144c0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
144d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
144e0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
144f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
14500 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61  Next = sqlite3Pa
14510 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  gerList;.    if(
14520 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14530 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
14540 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  t( sqlite3PagerL
14550 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b  ist->pPrev==0 );
14560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14570 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  gerList->pPrev =
14580 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20   pPager;.    }. 
14590 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76     pPager->pPrev
145a0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
145b0 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61  3PagerList = pPa
145c0 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
145d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
145e0 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
145f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14600 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
14610 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
14620 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
14630 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
14640 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
14650 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
14660 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
14670 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
14680 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
14690 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
146a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
146b0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
146c0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
146d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
146e0 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
146f0 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
14700 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14710 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
14720 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
14730 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
14740 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
14750 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
14760 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
14770 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
14780 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
14790 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
147a0 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
147b0 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
147c0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
147d0 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
147e0 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
147f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
14800 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
14810 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
14820 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
14830 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
14840 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
14850 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
14860 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
14870 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
14880 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
14890 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
148a0 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
148b0 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
148c0 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
148d0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
148e0 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
148f0 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
14900 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
14910 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
14920 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
14930 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
14940 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
14950 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
14960 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
14970 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
14980 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
14990 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
149a0 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
149b0 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
149c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
149d0 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
149e0 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
149f0 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
14a00 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
14a10 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
14a20 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
14a30 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f  the page size to
14a40 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20   *pPageSize. If 
14a50 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
14a60 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20  page size is.** 
14a70 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
14a80 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
14a90 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
14aa0 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  set to that.** v
14ab0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
14ac0 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
14ad0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
14ae0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
14af0 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53  ger, u16 *pPageS
14b00 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
14b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 31   SQLITE_OK;.  u1
14b20 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  6 pageSize = *pP
14b30 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
14b40 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
14b50 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
14b60 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
14b70 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
14b80 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61 67  ZE) );.  if( pag
14b90 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
14ba0 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
14bb0 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61 67  ize .   && !pPag
14bc0 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
14bd0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20 20  ger->nRef==0 .  
14be0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
14bf0 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
14c00 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53  te3_malloc(pageS
14c10 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
14c20 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
14c30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14c40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c50 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
14c60 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
14c70 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
14c80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
14c90 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
14ca0 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  e;.      setSect
14cb0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
14cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14cd0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
14ce0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
14cf0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
14d00 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61 67   pNew;.      pag
14d10 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
14d20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50  .    }.  }.  *pP
14d30 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
14d40 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 65  ->pageSize;.  re
14d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14d60 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
14d70 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f  er to the "tempo
14d80 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65  rary page" buffe
14d90 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c  r held internall
14da0 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65  y.** by the page
14db0 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75  r.  This is a bu
14dc0 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67  ffer that is big
14dd0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
14de0 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f  the.** entire co
14df0 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62  ntent of a datab
14e00 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  ase page.  This 
14e10 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69  buffer is used i
14e20 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72  nternally.** dur
14e30 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ing rollback and
14e40 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
14e50 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20  tten whenever a 
14e60 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
14e70 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  rs.  But other m
14e80 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20  odules are free 
14e90 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61  to use it too, a
14ea0 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20  s long as.** no 
14eb0 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61  rollbacks are ha
14ec0 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  ppening..*/.void
14ed0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65   *sqlite3PagerTe
14ee0 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70  mpSpace(Pager *p
14ef0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
14f00 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
14f10 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ce;.}../*.** Att
14f20 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
14f30 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
14f40 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
14f50 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
14f60 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
14f70 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
14f80 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
14f90 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
14fa0 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
14fb0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
14fc0 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
14fd0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
14fe0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
14ff0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
15000 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
15010 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
15020 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
15030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
15040 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
15050 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
15060 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
15070 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
15080 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
15090 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71  mxPage;.  }.  sq
150a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
150b0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72  unt(pPager);.  r
150c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
150d0 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
150e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
150f0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
15100 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
15110 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
15120 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
15130 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
15140 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
15150 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
15160 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
15170 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
15180 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
15190 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
151a0 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
151b0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
151c0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
151d0 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
151e0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
151f0 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
15200 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
15210 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
15220 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
15230 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
15240 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
15250 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
15260 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
15270 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
15280 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
15290 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
152a0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
152b0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
152c0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
152d0 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
152e0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
152f0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
15300 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
15310 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
15320 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
15330 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
15340 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
15350 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
15360 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
15370 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
15380 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15390 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
153a0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
153b0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
153c0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
153d0 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
153e0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
153f0 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
15400 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
15410 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
15420 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
15430 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
15440 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
15450 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
15460 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
15470 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
15480 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
15490 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
154a0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
154b0 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
154c0 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
154d0 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
154e0 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
154f0 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
15500 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
15510 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
15520 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
15530 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
15540 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
15550 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
15560 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15570 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
15580 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
15590 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
155a0 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
155b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
155c0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
155d0 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
155e0 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50  assert(MEMDB||pP
155f0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
15600 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
15610 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61  File);.  if( pPa
15620 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15630 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  s ){.    IOTRACE
15640 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
15650 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
15660 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15670 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
15680 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
15690 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
156a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
156b0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
156c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
156d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
156e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
156f0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
15700 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15710 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
15720 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15730 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
15740 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
15750 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
15760 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
15770 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
15780 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
15790 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
157a0 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
157b0 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
157c0 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
157d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
157e0 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
157f0 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
15800 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
15810 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
15820 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
15830 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
15840 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
15850 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
15860 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
15870 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
15880 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
15890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
158a0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
158b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
158c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
158d0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
158e0 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
158f0 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
15900 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
15910 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
15920 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
15930 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
15940 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  e);.    if( (pPa
15950 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15960 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d  s).     && (rc =
15970 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
15980 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
15990 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
159a0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
159b0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61  nRef++;.      pa
159c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
159d0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
159e0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
159f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15a00 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
15a10 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
15a20 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
15a30 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
15a40 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
15a50 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
15a60 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
15a70 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
15a80 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
15a90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15aa0 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
15ab0 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
15ac0 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
15ad0 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
15ae0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
15af0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
15b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
15b10 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
15b20 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
15b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15b40 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
15b50 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
15b60 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
15b70 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
15b80 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
15b90 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  Hist){.  sqlite3
15ba0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  _free(pHist->pOr
15bb0 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ig);.  sqlite3_f
15bc0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
15bd0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
15be0 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
15bf0 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
15c00 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
15c10 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
15c20 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
15c30 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
15c40 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
15c50 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
15c60 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
15c70 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  g from its hash 
15c80 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
15c90 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
15ca0 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
15cb0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
15cc0 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
15cd0 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
15ce0 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
15cf0 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
15d00 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
15d10 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
15d20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
15d30 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
15d40 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
15d50 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
15d60 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
15d70 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
15d80 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
15d90 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
15da0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
15db0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
15dc0 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
15dd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
15de0 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
15df0 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
15e00 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15e10 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
15e20 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
15e30 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
15e40 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
15e50 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
15e60 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
15e70 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
15e80 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
15e90 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
15ea0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d  ger->nHash-1)]!=
15eb0 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
15ec0 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
15ed0 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
15ee0 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
15ef0 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d      int h = pPg-
15f00 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
15f10 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70  >nHash-1);.    p
15f20 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
15f30 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
15f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
15f50 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69  B ){.    clearHi
15f60 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
15f70 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
15f80 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67  );.  }.  pPg->pg
15f90 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
15fa0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
15fb0 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
15fc0 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
15fd0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15fe0 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
15ff0 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
16000 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
16010 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
16020 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
16030 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
16040 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
16050 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
16060 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
16070 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
16080 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65   Unlink from fre
16090 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20  e page list */. 
160a0 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
160b0 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  Pg);..  /* Unlin
160c0 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
160d0 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
160e0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
160f0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
16100 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16110 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
16120 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
16130 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
16140 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
16150 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
16160 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
16170 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
16180 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
16190 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
161a0 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
161b0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
161c0 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
161d0 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
161e0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
161f0 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
16200 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
16210 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
16220 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
16230 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
16240 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
16250 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
16260 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
16270 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
16280 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
16290 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
162a0 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
162b0 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
162c0 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
162d0 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
162e0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
162f0 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
16300 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
16310 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
16320 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
16330 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
16340 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
16350 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
16360 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
16370 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
16380 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
16390 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
163a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
163b0 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
163c0 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
163d0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
163e0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
163f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16400 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
16410 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
16420 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
16430 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
16440 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
16450 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
16460 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
16470 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
16480 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
16490 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
164a0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
164b0 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
164c0 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
164d0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
164e0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
164f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16500 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pPg->pData);. 
16510 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16520 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
16530 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
16540 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16550 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
16560 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
16570 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
16580 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
16590 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
165a0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
165b0 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
165c0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
165d0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
165e0 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
165f0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
16600 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
16610 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
16620 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
16630 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
16640 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
16650 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
16660 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
16670 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
16680 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
16690 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
166a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
166b0 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
166c0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
166d0 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
166e0 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
166f0 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
16700 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16710 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
16720 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
16730 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16740 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
16750 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
16760 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
16770 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
16780 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
16790 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
167a0 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
167b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
167c0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
167d0 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
167e0 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
167f0 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
16800 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
16810 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
16820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
16830 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
16840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16850 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
16860 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
16870 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
16880 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
16890 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
168a0 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
168b0 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
168c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
168d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
168e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
168f0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
16900 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
16910 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
16920 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
16930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
16950 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
16960 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16970 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
16980 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
16990 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
169a0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
169b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
169c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
169d0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
169e0 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
169f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16a00 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
16a10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16a20 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
16a30 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
16a40 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
16a50 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
16a60 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
16a70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
16a80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16a90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
16aa0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
16ab0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
16ac0 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
16ad0 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
16ae0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
16af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16b00 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
16b10 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
16b20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
16b30 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
16b40 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
16b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
16b70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
16b80 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16b90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16ba0 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
16bb0 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e  ng. */.  pagerEn
16bc0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
16bd0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16be0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
16bf0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
16c00 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
16c10 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
16c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16c40 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
16c50 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
16c60 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
16c70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
16c80 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
16c90 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
16ca0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
16cb0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
16cc0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
16cd0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
16ce0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
16cf0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
16d00 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
16d10 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
16d20 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
16d30 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
16d40 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
16d50 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
16d60 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
16d70 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
16d80 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
16d90 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
16da0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
16db0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
16dc0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
16dd0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
16de0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
16df0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
16e00 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
16e10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
16e20 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
16e30 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
16e40 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
16e50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16e60 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
16e70 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
16e80 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
16e90 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
16ea0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
16eb0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
16ec0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
16ed0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
16ee0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
16ef0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
16f00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
16f10 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
16f20 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
16f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
16f40 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69  ex *mutex = sqli
16f50 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
16f60 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
16f70 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73  TIC_MEM2);.    s
16f80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16f90 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69  er(mutex);.    i
16fa0 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76  f( pPager->pPrev
16fb0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16fc0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
16fd0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
16fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
17000 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
17010 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
17020 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29   pPager->pNext )
17030 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17040 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
17050 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20  Pager->pPrev;.  
17060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
17070 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
17080 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  x);.  }.#endif..
17090 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
170a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
170b0 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
170c0 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
170d0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
170e0 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
170f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
17100 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
17110 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
17120 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
17130 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
17140 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
17150 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
17160 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
17170 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
17180 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
17190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
171a0 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
171b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
171c0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
171d0 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
171e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
171f0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
17200 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
17210 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
17220 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17230 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17240 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
17250 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
17260 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
17270 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
17280 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
17290 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
172a0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
172b0 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
172c0 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
172d0 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
172e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
172f0 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
17300 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
17310 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
17320 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
17330 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
17340 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
17350 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
17360 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
17370 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
17380 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
17390 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
173a0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
173b0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
173c0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
173d0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
173e0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
173f0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
17400 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
17410 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
17420 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
17430 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
17440 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
17450 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
17460 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
17470 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
17480 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
17490 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
174a0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
174b0 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
174c0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
174d0 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
174e0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
174f0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
17500 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
17510 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
17520 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
17530 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
17540 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
17550 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
17560 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
17570 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
17580 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
17590 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
175a0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
175b0 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
175c0 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
175d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
175e0 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
175f0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
17600 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
17610 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
17620 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
17630 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
17640 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c  ove it. */.    l
17650 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
17660 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
17670 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
17680 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d    pPg->nRef++;.}
17690 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
176a0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
176b0 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
176c0 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
176d0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
176e0 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
176f0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
17700 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
17710 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  f++;.    }.  }.#
17720 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
17730 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
17740 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
17750 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
17760 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
17770 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
17780 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
17790 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
177a0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
177b0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
177c0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
177d0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
177e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
177f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
17800 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
17810 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f  pPager);.  page_
17820 72 65 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ref(pPg);.  page
17830 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67  rLeave(pPg->pPag
17840 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
17850 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17860 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
17870 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
17880 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
17890 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
178a0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
178b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
178c0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
178d0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
178e0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
178f0 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
17900 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
17910 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
17920 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
17930 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
17940 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
17950 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
17960 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
17970 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
17980 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
17990 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
179a0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
179b0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
179c0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
179d0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
179e0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
179f0 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
17a00 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
17a10 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
17a20 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
17a30 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17a40 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
17a50 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
17a60 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
17a70 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17a80 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
17a90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
17aa0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
17ab0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
17ac0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
17ad0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17ae0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
17af0 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
17b00 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
17b10 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
17b20 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
17b30 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
17b40 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
17b50 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
17b60 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
17b70 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
17b80 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
17b90 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
17ba0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
17bb0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
17bc0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
17bd0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
17be0 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63  e, so no sync oc
17bf0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  curs..**.** If t
17c00 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
17c10 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20  IAL flag is set 
17c20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
17c30 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63  nt media on whic
17c40 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
17c50 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65  e is stored, the
17c60 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  n OsSync() is ne
17c70 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  ver called on th
17c80 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
17c90 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17ca0 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
17cb0 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74  ired is to updat
17cc0 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
17cd0 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   in.** the journ
17ce0 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  al header..**.**
17cf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
17d00 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
17d10 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
17d20 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
17d30 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
17d40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
17d50 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
17d60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
17d70 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
17d80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17d90 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
17da0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
17db0 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
17dc0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
17dd0 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
17de0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
17df0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
17e00 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
17e10 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
17e20 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
17e30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17e40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
17e50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
17e60 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
17e70 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
17e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17e90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17ea0 6e 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 61  n );..      /* a
17eb0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
17ec0 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
17ed0 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
17ee0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
17ef0 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
17f00 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
17f10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
17f20 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
17f30 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
17f40 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
17f50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
17f60 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
17f70 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
17f80 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
17f90 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
17fa0 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
17fb0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
17fc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
17fd0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
17fe0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
17ff0 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
18000 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
18010 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
18020 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
18030 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
18040 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18060 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
18070 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
18080 69 66 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  if.      if( 0==
18090 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
180a0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
180b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
180c0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
180d0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
180e0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
180f0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
18100 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
18110 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
18120 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
18130 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
18140 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
18150 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
18160 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
18170 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
18180 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
18190 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
181a0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
181b0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
181c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
181d0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
181e0 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
181f0 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
18200 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
18210 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
18220 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
18230 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
18240 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
18250 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
18260 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
18270 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
18280 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
18290 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
182a0 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
182b0 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
182c0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
182d0 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
182e0 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
182f0 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
18300 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
18310 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18320 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20   i64 jrnlOff;.  
18330 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
18340 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
18350 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
18360 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
18370 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
18380 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
18390 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
183a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
183b0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
183c0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
183d0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
183e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
183f0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
18400 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
18410 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
18420 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
18430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18440 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a      }..        j
18450 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
18460 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
18470 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
18480 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  ic);.        IOT
18490 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
184a0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
184b0 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b  r, jrnlOff, 4));
184c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
184d0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
184e0 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
184f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
18500 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
18510 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18520 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
18530 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
18540 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
18550 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
18560 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
18570 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
18580 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18590 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
185a0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
185b0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
185c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
185d0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
185e0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
185f0 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
18600 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
18610 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
18620 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
18630 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
18640 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
18650 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
18660 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18670 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
18680 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
18690 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
186a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
186b0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
186c0 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
186d0 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
186e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
186f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
18700 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
18710 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
18720 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
18730 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72   0;.    }.    lr
18740 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e  uListSetFirstSyn
18750 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ced(pPager);.  }
18760 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
18770 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
18780 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
18790 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
187a0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
187b0 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
187c0 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
187d0 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
187e0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
187f0 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
18800 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
18810 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
18820 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
18830 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
18840 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
18850 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
18860 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
18870 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18880 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
18890 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72  nced==pPager->lr
188a0 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  u.pFirst );.  }.
188b0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
188c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
188d0 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
188e0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
188f0 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
18900 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
18910 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
18920 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
18930 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
18940 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
18950 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
18960 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
18970 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
18980 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
18990 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
189a0 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
189b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
189c0 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
189d0 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
189e0 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
189f0 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
18a00 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
18a10 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
18a20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
18a30 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
18a40 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
18a50 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
18a60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
18a70 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
18a80 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
18a90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
18aa0 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
18ab0 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
18ac0 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
18ad0 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
18ae0 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
18af0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
18b00 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
18b10 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
18b20 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
18b30 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
18b40 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
18b50 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
18b60 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
18b70 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
18b80 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
18b90 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
18ba0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41   N_SORT_BUCKET_A
18bb0 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20  LLOC 25.#define 
18bc0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20  N_SORT_BUCKET   
18bd0 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51      25.#ifdef SQ
18be0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
18bf0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
18c00 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b  sort_bucket = 0;
18c10 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54  .  #undef N_SORT
18c20 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e  _BUCKET.  #defin
18c30 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
18c40 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61  \.   (sqlite3_pa
18c50 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18c60 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t?sqlite3_pager_
18c70 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f  n_sort_bucket:N_
18c80 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
18c90 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  C).#endif.static
18ca0 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67   PgHdr *sort_pag
18cb0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e  elist(PgHdr *pIn
18cc0 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f  ){.  PgHdr *a[N_
18cd0 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
18ce0 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  C], *p;.  int i;
18cf0 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
18d00 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
18d10 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
18d20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
18d30 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
18d40 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
18d50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18d60 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
18d70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
18d80 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
18d90 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
18da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18dc0 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
18dd0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
18de0 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
18df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18e00 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
18e10 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
18e20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20     /* Coverage: 
18e30 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65  To get here, the
18e40 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e  re need to be 2^
18e50 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20  (N_SORT_BUCKET) 
18e60 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
18e70 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
18e80 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f  list. This is po
18e90 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72  ssible, but impr
18ea0 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a  actical..      *
18eb0 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c  * Testing this l
18ec0 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74  ine is the point
18ed0 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   of global varia
18ee0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ble.      ** sql
18ef0 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
18f00 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20  t_bucket..      
18f10 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  */.      a[i] = 
18f20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
18f30 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
18f40 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
18f50 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
18f60 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
18f70 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
18f80 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
18f90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
18fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
18fb0 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
18fc0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
18fd0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
18fe0 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
18ff0 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
19000 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
19010 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19020 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
19030 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
19040 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
19050 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
19060 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
19070 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
19080 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70  ager;.  PgHdr *p
19090 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
190a0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
190b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
190c0 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
190d0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
190e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
190f0 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
19100 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
19110 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
19120 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
19130 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
19140 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
19150 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
19160 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
19170 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
19180 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
19190 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
191a0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
191b0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
191c0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
191d0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
191e0 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
191f0 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
19200 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
19210 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
19220 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
19230 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
19240 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
19250 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
19260 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
19270 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
19280 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
19290 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
192a0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
192b0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
192c0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
192d0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
192e0 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
192f0 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
19300 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
19310 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
19320 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
19330 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
19340 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
19350 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
19360 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
19370 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
19380 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
19390 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
193a0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
193b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
193c0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
193d0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
193e0 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
193f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19400 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
19410 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
19420 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
19430 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
19440 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
19450 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
19460 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
19470 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
19480 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
194a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
194b0 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
194c0 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f  ist(pList);.  fo
194d0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
194e0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
194f0 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79  assert( p->dirty
19500 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79   );.    p->dirty
19510 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 0;.  }.  whil
19520 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20  e( pList ){..   
19530 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
19540 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
19550 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
19560 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28   now. */.    if(
19570 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
19580 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
19590 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74  assert(pPager->t
195a0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
195b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
195c0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
195d0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
195e0 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fd, pPager->zFil
195f0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76         pPager->v
19620 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  fsFlags);.      
19630 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19640 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
19650 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
19660 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
19670 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
19680 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
19690 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
196a0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
196b0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
196c0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
196d0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
196e0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
196f0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
19700 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
19710 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
19720 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
19730 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
19740 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
19750 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19760 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
19770 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
19780 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
19790 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
197a0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
197b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68  geSize;.      ch
197c0 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
197d0 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
197e0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
197f0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
19800 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
19810 43 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE4("STORE %d pa
19820 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
19830 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19840 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
19850 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
19860 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
19870 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20  hash(pList));.  
19880 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
19890 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
198a0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
198b0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
198c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
198d0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
198e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
198f0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
19900 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
19910 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
19920 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
19930 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
19940 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
19950 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
19960 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
19970 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19980 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
19990 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
199a0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
199b0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
199c0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
199d0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
199e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
199f0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
19a00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19a10 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
19a20 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
19a30 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
19a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64   return rc;.#ifd
19a50 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
19a60 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
19a70 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
19a80 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19a90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
19aa0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
19ab0 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
19ac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19ad0 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
19ae0 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
19af0 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
19b00 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
19b10 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19b20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
19b30 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
19b40 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
19b50 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
19b60 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
19b70 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
19b80 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
19b90 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
19ba0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
19bb0 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  n pPager->pDirty
19bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19bd0 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65 20  n TRUE if there 
19be0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
19bf0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
19c00 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f  ger..** A hot jo
19c10 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
19c20 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  t needs to be pl
19c30 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  ayed back..**.**
19c40 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
19c50 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
19c60 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
19c70 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
19c80 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
19c90 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
19ca0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
19cb0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
19cc0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
19cd0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
19ce0 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65  me.  Just delete
19cf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
19d00 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
19d10 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
19d20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
19d30 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
19d40 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
19d50 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
19d60 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
19d70 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
19d80 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
19d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
19da0 28 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65  ( !sqlite3OsAcce
19db0 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
19dc0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
19dd0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
19de0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
19df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
19e00 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
19e10 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
19e20 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
19e30 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
19e40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19e50 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
19e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
19e70 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
19e80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
19e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
19ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
19eb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
19ec0 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
19ed0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
19ee0 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
19ef0 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
19f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
19f10 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
19f20 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
19f30 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
19f40 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
19f50 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
19f60 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  >errCode variabl
19f70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19f80 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
19f90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
19fa0 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
19fb0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
19fc0 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74  Pg = 0;..  /* It
19fd0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
19fe0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
19ff0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67  n unless the pag
1a000 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70  er object.  ** p
1a010 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61  ointed to by pPa
1a020 67 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74  ger has at least
1a030 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28   one free page (
1a040 70 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d  page with nRef==
1a050 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  0)..  */ .  asse
1a060 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73  rt(!MEMDB);.  as
1a070 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75  sert(pPager->lru
1a080 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20  .pFirst);..  /* 
1a090 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
1a0a0 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
1a0b0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
1a0c0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1a0d0 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
1a0e0 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
1a0f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  the journal..  *
1a100 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72  /.  pPg = pPager
1a110 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1a120 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
1a130 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
1a140 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
1a150 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
1a160 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
1a170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a180 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
1a190 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
1a1a0 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
1a1b0 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
1a1c0 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
1a1d0 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
1a1e0 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
1a1f0 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
1a200 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
1a210 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
1a220 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 7b  er->lru.pFirst){
1a230 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73  .    int iDc = s
1a240 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a250 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a260 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69  ager->fd);.    i
1a270 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
1a280 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1a290 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1a2a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a2b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
1a2c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1a2d0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1a2e0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1a2f0 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  D) ){.      /* I
1a300 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
1a310 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
1a320 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1a330 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
1a340 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1a350 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
1a360 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
1a370 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
1a380 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
1a390 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
1a3a0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
1a3b0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
1a3c0 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
1a3d0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1a3e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a3f0 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
1a400 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
1a410 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
1a420 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
1a430 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
1a440 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
1a450 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1a460 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a470 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
1a480 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a490 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1a4a0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
1a4b0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1a4c0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1a4d0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1a4e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a4f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1a500 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
1a510 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20  r->lru.pFirst;. 
1a520 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
1a530 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
1a540 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
1a550 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
1a560 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
1a570 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
1a580 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
1a590 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1a5a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
1a5b0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
1a5c0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1a5d0 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1a5e0 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
1a5f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
1a600 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1a610 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
1a620 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1a630 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   0;.    if( rc!=
1a640 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a660 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
1a670 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
1a680 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a690 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
1a6a0 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
1a6b0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
1a6c0 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
1a6d0 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
1a6e0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
1a6f0 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
1a700 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
1a710 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1a720 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
1a730 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
1a740 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1a750 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
1a760 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
1a770 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
1a780 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
1a790 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
1a7a0 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
1a7b0 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
1a7c0 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
1a7d0 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
1a7e0 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
1a7f0 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
1a800 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
1a810 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
1a820 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
1a830 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
1a840 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
1a850 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
1a860 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
1a870 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
1a880 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
1a890 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20  ALWAYS_ROLLBACK 
1a8a0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1a8b0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
1a8c0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
1a8d0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1a8e0 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
1a8f0 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
1a900 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
1a910 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e  ble.  */.  unlin
1a920 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73  kPage(pPg);.  as
1a930 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
1a940 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  =0 );..  *ppPg =
1a950 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1a960 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a970 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a980 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
1a990 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ENT./*.** This f
1a9a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1a9b0 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
1a9c0 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
1a9d0 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
1a9e0 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
1a9f0 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
1aa00 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
1aa10 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
1aa20 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
1aa30 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
1aa40 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
1aa50 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a  te3_free()ed..**
1aa60 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20  .** nReq is the 
1aa70 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1aa80 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  of memory requir
1aa90 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75  ed. Once this mu
1aaa0 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72  ch has.** been r
1aab0 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e  eleased, the fun
1aac0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54  ction returns. T
1aad0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1aae0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1aaf0 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
1ab00 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
1ab10 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1ab20 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d  te3PagerReleaseM
1ab30 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b  emory(int nReq){
1ab40 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64  .  int nReleased
1ab50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
1ab60 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  * Bytes of memor
1ab70 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66 61  y released so fa
1ab80 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  r */.  sqlite3_m
1ab90 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1aba0 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d     /* The MEM2 m
1abb0 75 74 65 78 20 2a 2f 0a 20 20 50 61 67 65 72 20  utex */.  Pager 
1abc0 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1abd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1abe0 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72 73  ping over pagers
1abf0 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
1ac00 72 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20 20  r *savedBusy;   
1ac10 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79 20    /* Saved copy 
1ac20 6f 66 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  of the busy hand
1ac30 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ler */.  int rc 
1ac40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1ac50 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
1ac60 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
1ac70 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 6d 75   mutex.  */.  mu
1ac80 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
1ac90 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1aca0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
1acb0 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  M2);.  sqlite3_m
1acc0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
1acd0 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20  );..  /* Signal 
1ace0 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
1acf0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65  nections that me
1ad00 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1ad10 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61  wants.  ** to ha
1ad20 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ve access to the
1ad30 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   pagers..  */.  
1ad40 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74  for(pPager=sqlit
1ad50 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61  e3PagerList; pPa
1ad60 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67  ger; pPager=pPag
1ad70 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1ad80 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
1ad90 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  M = 1;.  }..  wh
1ada0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1adb0 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  OK && (nReq<0 ||
1adc0 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
1add0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1ade0 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  Pg;.    PgHdr *p
1adf0 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20  Recycled;. .    
1ae00 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
1ae10 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
1ae20 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1ae30 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1ae40 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   If.    ** this 
1ae50 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1ae60 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 64   find one that d
1ae70 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73 79  oes require a sy
1ae80 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nc()..    */.   
1ae90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1aea0 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
1aeb0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1aec0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
1aed0 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  ));.    pPg = sq
1aee0 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
1aef0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20  .pFirstSynced;. 
1af00 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
1af10 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20   (pPg->needSync 
1af20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
1af30 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20  iInUseDB) ){.   
1af40 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1af50 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ree.pNext;.    }
1af60 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 7b  .    if( !pPg ){
1af70 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
1af80 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
1af90 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68  pFirst;.      wh
1afa0 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67 2d  ile( pPg && pPg-
1afb0 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44  >pPager->iInUseD
1afc0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  B ){.        pPg
1afd0 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e   = pPg->gfree.pN
1afe0 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1aff0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
1b000 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1b010 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1b020 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1b030 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f  IC_LRU));..    /
1b040 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74 68 65  * If pPg==0, the
1b050 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
1b060 65 20 68 61 73 20 66 61 69 6c 65 64 20 74 6f 20  e has failed to 
1b070 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 0a 20  find a page to. 
1b080 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49     ** recycle. I
1b090 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74 75  n this case retu
1b0a0 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75  rn early - no fu
1b0b0 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c  rther memory wil
1b0c0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c 65  l.    ** be rele
1b0d0 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ased..    */.   
1b0e0 20 69 66 28 20 21 70 50 67 20 29 20 62 72 65 61   if( !pPg ) brea
1b0f0 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 20 3d  k;..    pPager =
1b100 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1b110 20 20 61 73 73 65 72 74 28 21 70 50 67 2d 3e 6e    assert(!pPg->n
1b120 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d  eedSync || pPg==
1b130 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1b140 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  st);.    assert(
1b150 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1b160 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1b170 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  u.pFirstSynced);
1b180 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42 75 73  .  .    savedBus
1b190 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73  y = pPager->pBus
1b1a0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50  yHandler;.    pP
1b1b0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1b1c0 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  er = 0;.    rc =
1b1d0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1b1e0 50 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65  Pager, &pRecycle
1b1f0 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
1b200 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 73  pBusyHandler = s
1b210 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20 61 73  avedBusy;.    as
1b220 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d  sert(pRecycled==
1b230 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  pPg || rc!=SQLIT
1b240 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  E_OK);.    if( r
1b250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b260 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
1b270 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
1b280 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
1b290 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
1b2a0 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  been .      ** r
1b2b0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1b2c0 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
1b2d0 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
1b2e0 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
1b2f0 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
1b300 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
1b310 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
1b320 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
1b330 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
1b340 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
1b350 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
1b360 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1b370 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
1b380 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
1b390 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
1b3a0 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
1b3b0 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61   .      ** proba
1b3c0 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20  bly is though.. 
1b3d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
1b3e0 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
1b3f0 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
1b400 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
1b410 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1b420 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b430 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
1b440 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tAll;.      }els
1b450 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e{.        for( 
1b460 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pTmp=pPager->pAl
1b470 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
1b480 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
1b490 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
1b4a0 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
1b4b0 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
1b4c0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  extAll;.      }.
1b4d0 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1b4e0 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1b4f0 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1b500 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1b510 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1b520 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1b530 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1b540 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1b550 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1b560 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1b570 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1b580 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1b590 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1b5a0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1b5b0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1b5c0 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1b5d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b5e0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
1b5f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b600 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
1b610 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
1b620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1b630 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
1b640 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
1b650 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b660 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a  file or .      *
1b670 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
1b680 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
1b690 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
1b6a0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
1b6b0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
1b6c0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1b6d0 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
1b6e0 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
1b6f0 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
1b700 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
1b710 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
1b720 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
1b730 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
1b740 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  e .      ** of a
1b750 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
1b760 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
1b770 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1b780 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
1b790 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
1b7a0 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
1b7b0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
1b7c0 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20  E_IOERR ||.     
1b7d0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1b7e0 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  FULL ||.        
1b7f0 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53    rc==SQLITE_BUS
1b800 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  Y.      );.     
1b810 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b820 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1b830 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
1b840 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1b850 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
1b860 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74   }..  /* Clear t
1b870 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
1b880 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72  ment flags and r
1b890 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1b8a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1b8b0 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1b8c0 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1b8d0 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1b8e0 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1b8f0 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
1b900 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1b910 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
1b920 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1b930 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1b940 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a  s released.  */.
1b950 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
1b960 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
1b970 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1b980 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
1b990 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
1b9a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1b9b0 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1b9c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b9d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1b9e0 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
1b9f0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1ba00 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
1ba10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
1ba20 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
1ba30 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
1ba40 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1ba50 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
1ba60 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1ba70 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1ba80 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1ba90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1baa0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1bab0 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
1bac0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1bad0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1bae0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1baf0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1bb00 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
1bb10 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1bb20 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1bb30 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1bb40 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1bb50 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1bb60 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1bb70 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1bb80 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1bb90 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1bba0 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  o));.  if( pgno=
1bbb0 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 ){.    memcpy
1bbc0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1bbd0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48  Vers, &((u8*)PGH
1bbe0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
1bbf0 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
1bc30 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1bc40 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1bc50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
1bc60 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
1bc70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52  gno, 3);.  PAGER
1bc80 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64  TRACE4("FETCH %d
1bc90 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1bca0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1bcb0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1bcc0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1bcd0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1bce0 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72  h(pPg));.  retur
1bcf0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1bd00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1bd10 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1bd20 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
1bd30 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
1bd40 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
1bd50 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
1bd60 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
1bd70 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
1bd80 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
1bd90 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
1bda0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1bdb0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
1bdc0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
1bdd0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
1bde0 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
1bdf0 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
1be00 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
1be10 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1be20 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
1be30 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
1be40 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
1be50 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
1be60 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
1be70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1be80 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
1be90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1bea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1beb0 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b    int isHot = 0;
1bec0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
1bed0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
1bee0 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
1bef0 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
1bf00 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
1bf10 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
1bf20 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
1bf30 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
1bf40 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  s the chance to 
1bf50 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
1bf60 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
1bf70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1bf80 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
1bf90 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
1bfa0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
1bfb0 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
1bfc0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
1bfd0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1bfe0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1bff0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
1c000 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
1c010 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
1c020 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c030 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
1c040 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Hot = 1;.    }. 
1c050 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1c060 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1c070 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
1c080 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1c090 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
1c0a0 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65  is still in an e
1c0b0 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1c0c0 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20  ot proceed. The 
1c0d0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74  error .  ** stat
1c0e0 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  e will be cleare
1c0f0 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
1c100 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68  in the future wh
1c110 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a  en all page .  *
1c120 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65  * references are
1c130 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65   dropped and the
1c140 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
1c150 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20  scarded..  */.  
1c160 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1c170 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1c180 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1c190 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1c1a0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1c1b0 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  e;.  }..  if( pP
1c1c0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1c1d0 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48  ER_UNLOCK || isH
1c1e0 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ot ){.    sqlite
1c1f0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1c200 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
1c210 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1c220 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c230 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
1c240 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1c250 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
1c260 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1c270 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1c280 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
1c290 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1c2a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1c2c0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1c2d0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1c2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1c2f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1c300 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1c310 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  K );.      }.  .
1c320 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f        /* If a jo
1c330 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
1c340 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
1c350 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
1c360 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   on the.      **
1c370 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1c380 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
1c390 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
1c3a0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
1c3b0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1c3c0 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
1c3d0 6e 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69  nal(pPager) || i
1c3e0 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sHot ){.        
1c3f0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
1c400 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1c410 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
1c420 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
1c430 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
1c440 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
1c450 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1c460 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
1c470 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
1c480 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
1c490 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
1c4a0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
1c4b0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
1c4c0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1c4d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
1c4e0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
1c4f0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
1c500 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
1c510 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1c520 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
1c530 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
1c540 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
1c550 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
1c560 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
1c570 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
1c580 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
1c590 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
1c5a0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
1c5b0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
1c5c0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
1c5d0 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
1c5e0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
1c5f0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
1c600 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
1c610 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   ** obtain its o
1c620 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
1c630 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1c640 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  e file..        
1c650 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1c660 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
1c670 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
1c680 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c690 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1c6a0 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
1c6b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
1c6c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c6d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c6e0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1c6f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1c700 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
1c710 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1c720 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
1c730 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  }.          pPag
1c740 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1c750 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
1c760 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 20       }. .       
1c770 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
1c780 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
1c790 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
1c7a0 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
1c7b0 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
1c7c0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
1c7d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1c7e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
1c7f0 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
1c800 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
1c810 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
1c820 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
1c830 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
1c840 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
1c850 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68  r open unless th
1c860 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1c870 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20  file holds.     
1c880 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
1c890 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
1c8a0 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
1c8b0 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
1c8c0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c8d0 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65  sses opening the
1c8e0 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20   journal at the 
1c8f0 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20  same time..     
1c900 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1c910 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
1c920 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
1c930 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
1c940 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
1c950 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
1c960 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
1c970 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1c980 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
1c990 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  pen and.        
1c9a0 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
1c9b0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
1c9c0 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
1c9d0 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
1c9e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54  e.        ** OsT
1c9f0 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
1ca00 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
1ca10 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
1ca20 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
1ca30 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
1ca40 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
1ca50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ca60 20 20 20 69 66 28 20 21 69 73 48 6f 74 20 29 7b     if( !isHot ){
1ca70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ca80 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1ca90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1caa0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
1cab0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1cac0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
1cad0 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
1cae0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
1caf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1cb00 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
1cb10 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1cb20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1cb30 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
1cb40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1cb50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1cb60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1cb70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1cb80 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1cb90 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
1cba0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
1cbb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
1cbc0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1cbd0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
1cbe0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1cc00 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1cc10 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
1cc20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1cc30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1cc40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1cc50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1cc60 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
1cc70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cc80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1cc90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ccb0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1ccc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1ccd0 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d     return ((rc==
1cce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 7c 7c 72 63  SQLITE_NOMEM||rc
1ccf0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
1cd00 4f 4d 45 4d 29 3f 72 63 3a 53 51 4c 49 54 45 5f  OMEM)?rc:SQLITE_
1cd10 42 55 53 59 29 3b 0a 20 20 20 20 20 20 20 20 7d  BUSY);.        }
1cd20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1cd30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1cd40 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1cd50 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1cd60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1cd70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cd80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1cd90 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1cda0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1cdb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1cdc0 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  = 0;. .        /
1cdd0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
1cde0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1cdf0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
1ce00 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
1ce10 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
1ce20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
1ce30 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
1ce40 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1ce50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1ce60 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
1ce70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ce80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ce90 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1cea0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1ceb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1cec0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1ced0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1cee0 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20  _SHARED || .    
1cef0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1cf00 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
1cf10 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
1cf20 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
1cf30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
1cf40 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
1cf50 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
1cf60 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
1cf70 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20  d-lock has just 
1cf80 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e  been acquired on
1cf90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cfa0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  le.        ** an
1cfb0 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
1cfc0 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
1cfd0 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
1cfe0 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20  revious.        
1cff0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
1d000 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
1d010 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d020 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1d030 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
1d040 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
1d050 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1d060 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
1d070 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  he.        ** ca
1d080 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  che..        **.
1d090 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62          ** Datab
1d0a0 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
1d0b0 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
1d0c0 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
1d0d0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20  eginning.       
1d0e0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
1d0f0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
1d100 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
1d110 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
1d120 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  re.        ** a 
1d130 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
1d140 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
1d150 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
1d160 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
1d170 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
1d180 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
1d190 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
1d1a0 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
1d1b0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
1d1c0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
1d1d0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
1d1e0 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
1d1f0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
1d200 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
1d210 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
1d220 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63          ** detec
1d230 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
1d240 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
1d250 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
1d260 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
1d270 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
1d280 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
1d290 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61    */.        cha
1d2a0 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
1d2b0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1d2c0 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20  leVers)];.      
1d2d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1d2e0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1d2f0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
1d300 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1d310 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d320 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1d330 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  e;.        }..  
1d340 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d350 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
1d360 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1d370 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
1d380 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
1d390 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
1d3a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d3b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1d3c0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
1d3d0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
1d3e0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
1d3f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1d400 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d410 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d420 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
1d430 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1d440 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
1d450 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
1d460 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1d470 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rs));.        }.
1d480 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1d490 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
1d4a0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1d4b0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
1d4c0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
1d4d0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1d4e0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1d4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1d500 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1d510 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1d520 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
1d530 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
1d540 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1d550 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1d560 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
1d570 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1d580 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1d590 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
1d5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d5b0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
1d5c0 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20  PgHdr object.   
1d5d0 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20  Either create a 
1d5e0 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65  new one or reuse
1d5f0 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
1d600 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  one that is not 
1d610 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65  otherwise in use
1d620 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67  ..**.** A new Pg
1d630 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73  Hdr structure is
1d640 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20   created if any 
1d650 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1d660 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a   are.** true:.**
1d670 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
1d680 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65  have not exceede
1d690 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c  d our maximum al
1d6a0 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69  located cache si
1d6b0 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
1d6c0 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52  s set by the "PR
1d6d0 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22  AGMA cache_size"
1d6e0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1d6f0 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61      (2)  There a
1d700 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48  re no unused PgH
1d710 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c  dr objects avail
1d720 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d  able at this tim
1d730 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  e..**.**     (3)
1d740 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d    This is an in-
1d750 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1d760 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  .**.**     (4)  
1d770 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48  There are no PgH
1d780 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  dr objects that 
1d790 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  do not require a
1d7a0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1d7b0 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61       file sync a
1d7c0 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65  nd a sync of the
1d7d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1d7e0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
1d7f0 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65         prohibite
1d800 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
1d810 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69  se, reuse an exi
1d820 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e  sting PgHdr.  In
1d830 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1d840 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69  use an.** existi
1d850 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20  ng PgHdr if all 
1d860 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1d870 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1d880 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76       (1)  We hav
1d890 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63  e reached or exc
1d8a0 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75  eeded the maximu
1d8b0 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  m cache size.** 
1d8c0 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64           allowed
1d8d0 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68   by "PRAGMA cach
1d8e0 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20  e_size"..**.**  
1d8f0 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73     (2)  There is
1d900 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62   a PgHdr availab
1d910 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e  le with PgHdr->n
1d920 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20  Ref==0.**.**    
1d930 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74   (3)  We are not
1d940 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   in an in-memory
1d950 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
1d960 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20      (4)  Either 
1d970 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69  there is an avai
1d980 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74  lable PgHdr that
1d990 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a   does not need.*
1d9a0 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65  *          to be
1d9b0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
1d9c0 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e  or else disk syn
1d9d0 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c  cing is currentl
1d9e0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  y.**          al
1d9f0 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  lowed..*/.static
1da00 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61   int pagerAlloca
1da10 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  tePage(Pager *pP
1da20 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70  ager, PgHdr **pp
1da30 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
1da40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
1da50 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e  dr *pPg;.  int n
1da60 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20 43  ByteHdr;..  /* C
1da70 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64  reate a new PgHd
1da80 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  r if any of the 
1da90 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  four conditions 
1daa0 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62  defined .  ** ab
1dab0 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f 0a  ove are met: */.
1dac0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
1dad0 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
1dae0 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  ge.   || pPager-
1daf0 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a  >lru.pFirst==0 .
1db00 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c     || MEMDB.   |
1db10 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  | (pPager->lru.p
1db20 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26  FirstSynced==0 &
1db30 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  & pPager->doNotS
1db40 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 76 6f  ync).  ){.    vo
1db50 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 69  id *pData;.    i
1db60 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
1db70 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  >=pPager->nHash 
1db80 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
1db90 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
1dba0 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  (pPager,.       
1dbb0 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c    pPager->nHash<
1dbc0 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67  256 ? 256 : pPag
1dbd0 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20  er->nHash*2);.  
1dbe0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1dbf0 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  nHash==0 ){.    
1dc00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dc10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
1dc20 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1dc30 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  te_out;.      }.
1dc40 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c      }.    pagerL
1dc50 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1dc60 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73 69 7a    nByteHdr = siz
1dc70 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69 7a 65  eof(*pPg) + size
1dc80 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
1dc90 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
1dca0 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73         + MEMDB*s
1dcb0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
1dcc0 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  ;.    pPg = sqli
1dcd0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  te3_malloc( nByt
1dce0 65 48 64 72 20 29 3b 0a 20 20 20 20 69 66 28 20  eHdr );.    if( 
1dcf0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 44 61  pPg ){.      pDa
1dd00 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ta = sqlite3_mal
1dd10 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67  loc( pPager->pag
1dd20 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
1dd30 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20  f( pData==0 ){. 
1dd40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1dd50 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
1dd60 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20    pPg = 0;.     
1dd70 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
1dd80 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1dd90 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
1dda0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1ddb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1ddc0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1ddd0 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1dde0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
1ddf0 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a 20   0, nByteHdr);. 
1de00 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d 20     pPg->pData = 
1de10 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d 3e  pData;.    pPg->
1de20 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
1de30 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41  .    pPg->pNextA
1de40 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
1de50 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  l;.    pPager->p
1de60 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70  All = pPg;.    p
1de70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  Pager->nPage++;.
1de80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1de90 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74  Recycle an exist
1dea0 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20  ing page with a 
1deb0 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20  zero ref-count. 
1dec0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1ded0 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1dee0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
1def0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1df00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1df10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
1df20 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KED;.    }.    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 67 6f 74 6f 20 70   ){.      goto p
1df50 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1df60 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
1df70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1df80 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1df90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
1dfa0 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
1dfb0 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
1dfc0 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
1dfd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dfe0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1dff0 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ave the content 
1e000 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
1e010 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
1e020 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
1e030 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
1e040 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  nt==1, then the 
1e050 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a  content was.** j
1e060 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ust initialized 
1e070 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64  to zeros instead
1e080 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
1e090 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74  rom disk..** But
1e0a0 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65   now we need the
1e0b0 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f   real data off o
1e0c0 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65  f disk.  So make
1e0d0 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65   sure we.** have
1e0e0 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e   it.  Read it in
1e0f0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   if we do not ha
1e100 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a  ve it already..*
1e110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e120 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50  er_get_content(P
1e130 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
1e140 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20  ( pPg->needRead 
1e150 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
1e160 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
1e170 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
1e180 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
1e190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e1a0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
1e1b0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1e1c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1e1d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1e1e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e1f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1e200 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
1e210 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
1e220 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
1e230 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
1e240 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
1e250 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
1e260 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
1e270 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
1e280 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1e290 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
1e2a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e2b0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
1e2c0 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
1e2d0 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
1e2e0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
1e2f0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
1e300 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
1e310 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
1e320 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
1e330 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
1e340 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
1e350 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
1e360 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
1e370 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
1e380 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
1e390 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
1e3a0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
1e3b0 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
1e3c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
1e3d0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
1e3e0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
1e3f0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
1e400 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
1e410 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
1e420 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
1e430 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
1e440 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1e450 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1e460 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1e470 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
1e480 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1e490 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
1e4a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
1e4b0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
1e4c0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
1e4d0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
1e4e0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
1e4f0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
1e500 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
1e510 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
1e520 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
1e530 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
1e540 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
1e550 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
1e560 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
1e570 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
1e580 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
1e590 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
1e5a0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
1e5b0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
1e5c0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
1e5d0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
1e5e0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
1e5f0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
1e600 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
1e610 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
1e620 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
1e630 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
1e640 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  es..**.** If noC
1e650 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  ontent is false,
1e660 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1e670 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
1e680 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
1e690 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
1e6a0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
1e6b0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
1e6c0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1e6d0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
1e6e0 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
1e6f0 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  time, so do not 
1e700 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20  do a disk read. 
1e710 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
1e720 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e  e.** page conten
1e730 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42  t with zeros.  B
1e740 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74  ut mark the fact
1e750 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
1e760 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f  t read the.** co
1e770 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67  ntent by setting
1e780 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1e790 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72  ead flag.  Later
1e7a0 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69   on, if .** sqli
1e7b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1e7c0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  is called on thi
1e7d0 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69  s page or if thi
1e7e0 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
1e7f0 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74  called again wit
1e800 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20  h noContent==0, 
1e810 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
1e820 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  the content is n
1e830 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  eeded.** and the
1e840 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c   disk read shoul
1e850 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
1e860 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
1e870 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
1e880 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1e890 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1e8a0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1e8b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e8c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1e8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1e8e0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1e8f0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1e900 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1e910 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1e920 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1e930 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1e940 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1e950 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1e960 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1e970 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1e980 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1e990 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1e9a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e9b0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
1e9c0 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
1e9d0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
1e9e0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
1e9f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1ea00 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
1ea10 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
1ea20 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
1ea30 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1ea40 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
1ea50 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
1ea60 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
1ea70 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
1ea80 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
1ea90 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1eaa0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1eab0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1eac0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
1ead0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
1eae0 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
1eaf0 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
1eb00 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
1eb10 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1eb20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  *ppPage = 0;..  
1eb30 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1eb40 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
1eb50 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
1eb60 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
1eb70 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
1eb80 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
1eb90 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
1eba0 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
1ebb0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
1ebc0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
1ebd0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1ebe0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
1ebf0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
1ec00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ec10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1ec20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ec30 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1ec40 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d  LOCK );..  pPg =
1ec50 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1ec60 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
1ec70 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1ec80 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1ec90 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
1eca0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1ecb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
1ecc0 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  ;.    int h;.   
1ecd0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1ece0 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
1ecf0 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61  rc = pagerAlloca
1ed00 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20 26  tePage(pPager, &
1ed10 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1ed20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ed30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ed40 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
1ed50 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
1ed60 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1ed70 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  || pgno>pPager->
1ed80 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  stmtSize );.    
1ed90 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
1eda0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1edb0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
1edc0 67 44 62 53 69 7a 65 20 29 7b 0a 23 69 66 20 30  gDbSize ){.#if 0
1edd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
1ede0 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
1edf0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
1ee00 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66 0a 20 20  no/8);.#endif.  
1ee10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ee20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1ee30 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1ee40 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
1ee50 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1ee60 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
1ee70 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
1ee80 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1ee90 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1eea0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1eeb0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1eec0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
1eed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
1eee0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1eef0 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
1ef00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1ef10 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
1ef20 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
1ef30 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1ef40 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
1ef50 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
1ef60 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
1ef70 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20     }.    nMax = 
1ef80 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1ef90 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1efa0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
1efb0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
1efc0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1efd0 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Code;.      sqli
1efe0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1eff0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
1f000 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1f010 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
1f020 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
1f030 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
1f040 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1f050 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
1f060 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
1f070 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
1f080 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
1f090 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
1f0a0 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
1f0b0 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20  | (noContent && 
1f0c0 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
1f0d0 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20  ollback) ){.    
1f0e0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
1f0f0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1f100 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f110 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1f120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f130 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_FULL;.      }
1f140 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
1f150 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1f160 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
1f170 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
1f180 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f  g->needRead = no
1f190 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
1f1a0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1f1b0 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
1f1c0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
1f1d0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1f1e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f1f0 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1f200 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
1f210 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
1f220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f230 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1f240 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1f250 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
1f260 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gno = 0;.       
1f270 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f280 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1f290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f2a0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e    }.      pPg->n
1f2b0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1f2c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
1f2d0 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
1f2e0 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
1f2f0 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
1f300 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
1f310 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
1f320 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
1f330 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1f340 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
1f350 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
1f360 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1f370 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
1f380 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
1f390 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
1f3a0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
1f3b0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
1f3c0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
1f3d0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
1f3e0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
1f3f0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1f400 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
1f410 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1f420 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1f430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f440 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1f450 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
1f460 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
1f470 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1f480 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
1f490 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  1);.    PAGER_IN
1f4a0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
1f4b0 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e  ;.    if( !noCon
1f4c0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
1f4d0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1f4e0 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20  tent(pPg);.     
1f4f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1f500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f520 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1f530 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70   }.  *ppPage = p
1f540 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
1f550 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1f560 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
1f570 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1f580 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
1f590 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
1f5a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f5b0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
1f5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1f5d0 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
1f5e0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
1f5f0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
1f600 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
1f610 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
1f620 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
1f630 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
1f640 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
1f650 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
1f660 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
1f670 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
1f680 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1f690 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
1f6a0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
1f6b0 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
1f6c0 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ent);.  pagerLea
1f6d0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
1f6e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1f6f0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1f700 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
1f710 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
1f720 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
1f730 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
1f740 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
1f750 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1f760 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
1f770 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
1f780 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1f790 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1f7a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
1f7b0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
1f7c0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1f7d0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
1f7e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1f7f0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
1f800 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
1f810 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
1f820 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
1f830 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1f840 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
1f850 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1f860 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
1f870 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1f880 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
1f890 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
1f8a0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
1f8b0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
1f8c0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
1f8d0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
1f8e0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1f8f0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1f900 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1f910 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1f920 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
1f930 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  );..  pagerEnter
1f940 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
1f950 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1f960 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1f970 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1f980 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67  er->pAll || pPag
1f990 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1f9a0 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  e );.  }else if(
1f9b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1f9c0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1f9d0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1f9e0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   ){.    /* Do no
1f9f0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65  thing */.  }else
1fa00 20 69 66 28 20 28 70 50 67 20 3d 20 70 61 67 65   if( (pPg = page
1fa10 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1fa20 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20   pgno))!=0 ){.  
1fa30 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
1fa40 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
1fa50 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1fa60 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
1fa70 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
1fa80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1fa90 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
1faa0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
1fab0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
1fac0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
1fad0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
1fae0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
1faf0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
1fb00 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
1fb10 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
1fb20 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
1fb30 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
1fb40 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
1fb50 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
1fb60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fb70 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1fb80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1fb90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1fba0 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
1fbb0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1fbc0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
1fbd0 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1fbe0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1fbf0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
1fc00 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  ->pPager);.  pPg
1fc10 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45  ->nRef--;..  CHE
1fc20 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1fc30 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
1fc40 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1fc50 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
1fc60 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
1fc70 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
1fc80 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
1fc90 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
1fca0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
1fcb0 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  nRef==0 ){..    
1fcc0 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
1fcd0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1fce0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
1fcf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
1fd00 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
1fd10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1fd20 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1fd30 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
1fd40 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
1fd50 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
1fd60 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
1fd70 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1fd80 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
1fd90 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
1fda0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1fdb0 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
1fdc0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1fdd0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
1fde0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1fdf0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
1fe00 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
1fe10 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
1fe20 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1fe30 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1fe40 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1fe50 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
1fe60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1fe70 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
1fe80 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
1fe90 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
1fea0 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
1feb0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
1fec0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1fed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fee0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1fef0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1ff00 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1ff10 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1ff20 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
1ff30 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
1ff40 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
1ff50 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
1ff60 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1ff70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ff80 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1ff90 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1ffa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1ffb0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1ffc0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  >pVfs;.  int fla
1ffd0 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
1ffe0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
1fff0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
20000 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
20010 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63  EATE);..  int rc
20020 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
20030 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
20040 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
20050 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
20060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20070 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
20080 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20090 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
200a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
200b0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
200c0 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
200d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
200e0 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
200f0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20100 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
20110 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
20120 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d  locZero( pPager-
20130 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
20140 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
20150 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
20160 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
20170 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
20180 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20190 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
201a0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
201b0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
201c0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
201d0 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
201e0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
201f0 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
20200 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
20210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61    }else{.    fla
20220 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
20230 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
20240 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
20250 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
20260 43 5f 57 52 49 54 45 0a 20 20 72 63 20 3d 20 73  C_WRITE.  rc = s
20270 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
20280 6e 28 0a 20 20 20 20 20 20 70 56 66 73 2c 20 70  n(.      pVfs, p
20290 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
202a0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
202b0 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
202c0 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 29 3b  ize(pPager).  );
202d0 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71  .#else.  rc = sq
202e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
202f0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
20300 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
20310 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64   flags, 0);.#end
20320 69 66 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  if.  assert( rc!
20330 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
20340 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
20350 6f 64 73 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ods );.  pPager-
20360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
20370 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
20380 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
20390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
203a0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
203b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
203c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
203d0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
203e0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
203f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
20400 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  nal, 0);.    }. 
20410 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
20420 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
20430 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
20440 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
20450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20460 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
20470 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
20480 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
20490 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
204a0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
204b0 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
204c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
204d0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
204e0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f  >errCode;.    go
204f0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
20500 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
20510 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
20520 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
20530 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
20540 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
20550 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
20560 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
20570 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  en && rc==SQLITE
20580 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
20590 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
205a0 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  Begin(pPager);. 
205b0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
205c0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
205d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63  LITE_NOMEM && rc
205e0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  !=SQLITE_IOERR_N
205f0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
20600 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
20610 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
20620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20640 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
20650 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20660 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
20670 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
20680 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20690 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
206a0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  al);.  pPager->a
206b0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
206c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
206d0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
206e0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
206f0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
20700 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
20710 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
20720 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
20730 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
20740 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
20750 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20760 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
20770 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
20780 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
20790 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
207a0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
207b0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
207c0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
207d0 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
207e0 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
207f0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
20800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
20810 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
20820 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20830 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
20840 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
20850 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
20860 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
20870 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
20880 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
20890 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
208a0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
208b0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
208c0 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
208d0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
208e0 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
208f0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
20900 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
20910 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
20920 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
20930 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
20940 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
20950 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
20960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
20970 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
20980 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
20990 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
209a0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
209b0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
209c0 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
209d0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
209e0 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
209f0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
20a00 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
20a10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
20a20 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
20a30 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
20a40 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
20a50 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
20a60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
20a70 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
20a80 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
20a90 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
20aa0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
20ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
20ac0 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
20ad0 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
20ae0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
20af0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
20b00 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
20b10 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
20b20 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
20b30 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
20b40 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
20b50 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
20b60 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
20b70 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
20b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
20b90 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
20ba0 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
20bb0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20bc0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
20bd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20be0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
20bf0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
20c00 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
20c10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20c20 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
20c30 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
20c40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20c50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
20c60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20c70 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
20c80 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
20c90 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
20ca0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20cb0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
20cc0 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
20cd0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
20ce0 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
20cf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d00 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
20d10 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
20d20 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
20d30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20d40 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20d50 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
20d60 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
20d70 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
20d80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
20d90 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
20da0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
20db0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
20dc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20dd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20df0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
20e00 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
20e10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20e20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
20e30 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
20e40 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
20e50 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
20e60 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20e70 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
20e80 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
20e90 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
20ea0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
20eb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
20ec0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
20ed0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20ee0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
20ef0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20f00 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20f10 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
20f20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
20f30 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
20f40 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
20f50 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73  -access mode las
20f60 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
20f70 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
20f80 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
20f90 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
20fa0 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
20fb0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
20fc0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
20fd0 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
20fe0 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
20ff0 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
21000 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f  and truncated to
21010 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f   0 bytes..    */
21020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21030 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
21040 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21050 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
21060 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21070 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
21080 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
21090 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
210a0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
210b0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
210c0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
210d0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
210e0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
210f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
21100 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61 67  8 + 1 );.    pag
21110 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
21120 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
21130 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->aInJournal ){.
21140 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21150 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
21160 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
21170 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
21180 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
21190 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
211a0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
211b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
211c0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
211d0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
211e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
211f0 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
21200 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c  E_OK );.  pagerL
21210 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
21220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21230 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
21240 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
21250 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
21260 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
21270 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
21280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21290 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
212a0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
212b0 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
212c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
212d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
212e0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
212f0 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
21300 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
21310 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
21320 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
21330 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
21340 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
21350 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
21360 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
21370 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
21380 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
21390 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
213a0 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
213b0 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
213c0 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
213d0 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
213e0 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
213f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
21400 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
21410 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
21420 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
21430 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
21440 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
21450 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
21460 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e  t( pPg->pDirty->
21470 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20  pPrevDirty==pPg 
21480 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  );.      pPg->pD
21490 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
214a0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
214b0 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
214c0 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
214d0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
214e0 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  t( pPg->pPrevDir
214f0 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20  ty->pDirty==pPg 
21500 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  );.      pPg->pP
21510 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
21520 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
21530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21540 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
21550 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50  ager->pDirty==pP
21560 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
21570 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21580 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
21590 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
215a0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
215b0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
215c0 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
215d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
215e0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
215f0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
21600 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
21610 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
21620 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
21630 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
21640 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
21650 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
21660 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21670 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
21680 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
21690 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
216a0 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
216b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
216c0 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
216d0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
216e0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
216f0 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
21700 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
21710 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
21720 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
21730 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
21740 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
21750 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
21760 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
21770 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
21780 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
21790 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
217a0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
217b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
217c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
217d0 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
217e0 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
217f0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
21800 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
21810 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
21820 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
21830 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
21840 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
21850 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
21860 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
21870 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
21880 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
21890 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
218a0 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
218b0 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  Rollback() to.**
218c0 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
218d0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
218e0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
218f0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50   void *pData = P
21900 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
21910 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
21920 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
21930 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21940 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
21950 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
21960 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
21970 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
21980 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21990 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
219a0 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
219b0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
219c0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
219d0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
219e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
219f0 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
21a00 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  GE(pPg);..  /* I
21a10 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20  f this page was 
21a20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
21a30 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
21a40 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e  nt==1, that mean
21a50 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74  s.  ** we didn't
21a60 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20   really read in 
21a70 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
21a80 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63  he page.  This c
21a90 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28  an happen.  ** (
21aa0 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65  for example) whe
21ab0 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
21ac0 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  ing moved to the
21ad0 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a   freelist.  But.
21ae0 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20    ** now we are 
21af0 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67  (perhaps) moving
21b00 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66   the page off of
21b10 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f   the freelist fo
21b20 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64  r.  ** reuse and
21b30 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
21b40 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
21b50 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f  ntent so that co
21b60 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62  ntent.  ** can b
21b70 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
21b80 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
21b90 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61  .  So do the rea
21ba0 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74  d at this.  ** t
21bb0 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ime..  */.  rc =
21bc0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
21bd0 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72  nt(pPg);.  if( r
21be0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
21bf0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rc;.  }..  /* Ma
21c00 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
21c10 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
21c20 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
21c30 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
21c40 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
21c50 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
21c60 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
21c70 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28   */.  makeDirty(
21c80 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  pPg);.  if( pPg-
21c90 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
21ca0 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
21cb0 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  Pg) || pPager->s
21cc0 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
21cd0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
21ce0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65  yCache = 1;.  }e
21cf0 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
21d00 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
21d10 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
21d20 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
21d30 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
21d40 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
21d50 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
21d60 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
21d70 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
21d80 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
21d90 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
21da0 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
21db0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
21dc0 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
21dd0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
21de0 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
21df0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
21e00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
21e10 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
21e20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
21e30 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
21e40 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
21e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
21e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21e80 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21e90 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
21ea0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
21eb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
21ec0 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
21ed0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
21ee0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
21ef0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
21f00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21f10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
21f20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21f40 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
21f50 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
21f60 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
21f70 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
21f80 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
21f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
21fa0 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
21fb0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
21fc0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
21fd0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
21fe0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
21ff0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
22000 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
22010 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
22020 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
22030 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
22040 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
22050 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
22060 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
22070 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75  al && (pPager->u
22080 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d  seJournal || MEM
22090 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
220a0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
220b0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
220c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
220d0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
220e0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
220f0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
22100 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
22110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
22120 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f   PAGERTRACE3("JO
22130 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
22140 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
22150 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
22160 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
22170 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
22180 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
22190 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
221a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
221b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
221c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
221d0 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
221e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
221f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22200 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
22210 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22220 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
22230 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22240 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
22250 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ize);.        }e
22260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
22270 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
22280 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
22290 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
222a0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
222b0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
222c0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
222d0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
222e0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
222f0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
22300 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
22310 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
22320 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
22330 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
22340 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22350 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
22360 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
22370 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
22380 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
22390 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
223a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
223b0 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
223c0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
223d0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
223e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
223f0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
22400 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
22410 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
22420 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
22430 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22460 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
22470 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
22480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
22490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
224c0 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
224d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
224e0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
224f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
22500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22530 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22540 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
22550 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
22560 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b  rnalOff, cksum);
22570 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
22580 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22590 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
225a0 7d 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  }.          IOTR
225b0 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
225c0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
225d0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
225e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
225f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22600 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
22610 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
22620 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
22630 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
22640 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
22650 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
22660 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE5("JOURNAL %d 
22670 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
22680 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
22690 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
226a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
226b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
226c0 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67  g->needSync, pag
226d0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
226e0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  );..          /*
226f0 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
22700 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
22710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22720 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
22730 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
22740 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
22750 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
22760 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
22770 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22790 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
227a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
227b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
227c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
227d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
227e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
227f0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
22800 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22810 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
22820 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
22830 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
22840 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
22850 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
22860 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
22870 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
22880 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
22890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
228a0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
228b0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
228c0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
228d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
228e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
228f0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
22900 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
22910 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
22920 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
22930 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
22940 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
22950 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
22960 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
22970 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
22980 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
22990 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
229a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
229b0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
229c0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
229d0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
229e0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
229f0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
22a00 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
22a10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
22a20 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
22a30 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
22a40 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
22a50 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
22a60 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
22a70 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
22a80 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
22a90 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
22aa0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
22ab0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
22ac0 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
22ad0 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
22ae0 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
22af0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
22b00 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
22b10 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
22b20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
22b30 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20  er->stmtInUse . 
22b40 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74      && !pageInSt
22b50 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20  atement(pPg) .  
22b60 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
22b70 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
22b80 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20  mtSize .    ){. 
22b90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
22ba0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
22bb0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
22bc0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
22bd0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   );.      if( ME
22be0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
22bf0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
22c00 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
22c10 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
22c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
22c30 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b  ist->pStmt==0 );
22c40 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
22c50 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f  pStmt = sqlite3_
22c60 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  malloc( pPager->
22c70 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
22c80 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
22c90 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
22ca0 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
22cb0 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
22cc0 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
22cd0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
22ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22cf0 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
22d00 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
22d10 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
22d20 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
22d30 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61  gno);.        pa
22d40 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
22d50 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
22d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
22d70 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
22d80 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b  er->stmtNRec*(4+
22d90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22da0 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  );.        char 
22db0 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
22dc0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
22dd0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
22de0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22df0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
22e00 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  stfd, offset, pP
22e10 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
22e20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
22e50 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
22e60 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
22e70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
22e80 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  set+4);.        
22e90 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
22ea0 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
22eb0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
22ec0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
22ed0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
22ee0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22f00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
22f10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22f20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
22f30 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
22f40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22f50 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
22f60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
22f70 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
22f80 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
22f90 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
22fa0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22fb0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
22fc0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
22fd0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
22fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
22ff0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
23000 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
23010 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
23020 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
23030 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
23040 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
23050 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
23060 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
23070 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
23080 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
23090 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
230a0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
230b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
230c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
230d0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
230e0 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
230f0 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
23100 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
23110 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
23120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
23130 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
23140 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
23150 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
23160 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
23170 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
23180 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
23190 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
231a0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
231b0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
231c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
231d0 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
231e0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
231f0 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
23200 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
23210 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
23220 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
23230 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
23240 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
23250 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
23260 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
23270 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
23280 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23290 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
232a0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
232b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
232c0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
232d0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
232e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
232f0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
23300 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
23310 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
23320 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
23330 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
23340 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
23350 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  er);.  if( !MEMD
23360 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
23370 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
23380 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
23390 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
233a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
233b0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
233c0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
233d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
233e0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
233f0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
23400 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
23410 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
23420 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23430 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
23440 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
23450 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
23460 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
23470 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
23480 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
23490 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
234a0 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
234b0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
234c0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
234d0 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
234e0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
234f0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
23500 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
23510 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
23520 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
23530 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
23540 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
23550 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
23560 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
23570 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
23580 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
23590 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
235a0 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
235b0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
235c0 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
235d0 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
235e0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
235f0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
23600 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
23610 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
23620 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
23630 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
23640 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
23650 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
23660 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
23670 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
23680 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
23690 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
236a0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
236b0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
236c0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
236d0 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
236e0 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
236f0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
23700 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
23710 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
23720 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
23730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
23740 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
23750 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
23760 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
23770 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
23780 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
23790 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
237a0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
237b0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
237c0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
237d0 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
237e0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
237f0 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
23800 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
23810 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
23820 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67  aInJournal || pg
23830 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a  ==pPg->pgno || .
23840 20 20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61            pg>pPa
23850 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
23860 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  || !(pPager->aIn
23870 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31  Journal[pg/8]&(1
23880 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20 20  <<(pg&7))).     
23890 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   ) {.        if(
238a0 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
238b0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
238c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
238d0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
238e0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
238f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23910 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23920 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
23930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
23940 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
23950 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
23960 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
23970 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
23980 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
23990 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
239a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
239b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
239c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
239d0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
239e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
239f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
23a00 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
23a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
23a20 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
23a30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23a40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
23a50 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
23a60 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  c flag is set fo
23a70 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
23a80 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
23a90 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
23aa0 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
23ab0 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
23ac0 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
23ad0 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
23ae0 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
23af0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
23b00 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
23b10 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
23b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
23b30 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
23b40 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
23b50 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
23b60 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
23b70 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
23b80 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
23b90 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
23ba0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
23bb0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ync ){.      for
23bc0 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
23bd0 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b  && needSync; ii+
23be0 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64  +){.        PgHd
23bf0 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72  r *pPage = pager
23c00 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
23c10 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20  pg1+ii);.       
23c20 20 69 66 28 20 70 50 61 67 65 20 29 20 70 50 61   if( pPage ) pPa
23c30 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  ge->needSync = 1
23c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23c50 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
23c60 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
23c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23c80 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
23c90 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
23ca0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
23cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
23cc0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
23cd0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61  bPage);.  }.  pa
23ce0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
23cf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23d00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
23d10 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
23d20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
23d30 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
23d40 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
23d50 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
23d60 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
23d70 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
23d80 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
23d90 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
23da0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
23db0 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
23dc0 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
23dd0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
23de0 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
23df0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
23e00 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dirty;.}.#endif.
23e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23e20 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
23e30 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
23e40 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
23e50 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
23e60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
23e70 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
23e80 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
23e90 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
23ea0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
23eb0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
23ec0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
23ed0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
23ee0 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  c;..  pagerEnter
23ef0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
23f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
23f10 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
23f20 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pPg);.  if( rc==
23f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23f50 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
23f60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23f70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
23f80 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72  cpy(sqlite3Pager
23f90 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44  GetData(pPg), pD
23fa0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
23fb0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
23fc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
23fd0 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
23fe0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
23ff0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
24000 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24010 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
24020 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
24030 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
24040 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
24050 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
24060 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
24070 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
24080 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
24090 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
240a0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
240b0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
240c0 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
240d0 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
240e0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
240f0 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
24100 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
24110 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
24120 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
24130 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
24140 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
24150 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
24160 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
24170 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
24180 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
24190 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
241a0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
241b0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
241c0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
241d0 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
241e0 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
241f0 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
24200 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
24210 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
24220 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
24230 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
24240 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
24250 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
24260 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
24270 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
24280 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
24290 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
242a0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
242b0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
242c0 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
242d0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
242e0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
242f0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
24300 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
24310 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
24320 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
24330 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
24340 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
24350 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
24360 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
24370 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
24380 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
24390 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
243a0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
243b0 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
243c0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
243d0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
243e0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
243f0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
24400 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
24410 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
24420 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c  used,.** the sql
24430 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
24440 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
24450 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
24460 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
24470 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69  age contains cri
24480 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
24490 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
244a0 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20  sure it gets.** 
244b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
244c0 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69  pite of the sqli
244d0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
244e0 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
244f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
24500 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
24510 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
24520 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
24530 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
24540 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
24550 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  er;..  if( MEMDB
24560 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61 67   ) return;.  pag
24570 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
24580 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
24590 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
245a0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20  ( pPg->dirty && 
245b0 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
245c0 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
245d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
245e0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
245f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
24600 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
24610 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
24620 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
24630 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
24640 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
24650 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
24660 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
24670 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
24680 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
24690 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
246a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
246b0 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
246c0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
246d0 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
246e0 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
246f0 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
24700 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
24710 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
24720 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
24730 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
24740 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
24750 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
24760 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
24770 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
24780 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
24790 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
247a0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
247b0 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
247c0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
247d0 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
247e0 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
247f0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
24800 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
24810 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
24820 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
24830 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
24840 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
24850 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
24860 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
24870 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
24880 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
24890 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
248a0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
248b0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
248c0 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65  gno)).      make
248d0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64  Clean(pPg);.#ifd
248e0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
248f0 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
24900 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
24910 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
24920 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
24930 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
24940 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
24950 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
24960 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
24970 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
24980 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
24990 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
249a0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
249b0 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
249c0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
249d0 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
249e0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
249f0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
24a00 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
24a10 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
24a20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
24a30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61  ..**.** If we ha
24a40 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61  ve not yet actua
24a50 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e  lly read the con
24a60 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67  tent of this pag
24a70 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48  e (if.** the PgH
24a80 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
24a90 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68   is set) then th
24aa0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
24ab0 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20  as a promise.** 
24ac0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76  that we will nev
24ad0 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20  er need to read 
24ae0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
24af0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
24b00 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65  ** so the needRe
24b10 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63  ad flag can be c
24b20 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70  leared at this p
24b30 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
24b40 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
24b50 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 73   called from a s
24b60 69 6e 67 6c 65 20 70 6c 61 63 65 20 69 6e 20 74  ingle place in t
24b70 68 65 20 73 71 6c 69 74 65 20 62 74 72 65 65 0a  he sqlite btree.
24b80 2a 2a 20 63 6f 64 65 20 28 77 68 65 6e 20 61 20  ** code (when a 
24b90 6c 65 61 66 20 69 73 20 72 65 6d 6f 76 65 64 20  leaf is removed 
24ba0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
24bb0 73 74 29 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  st). This allows
24bc0 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
24bd0 67 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 74 6f  g assumptions to
24be0 20 62 65 20 6d 61 64 65 20 61 62 6f 75 74 20 70   be made about p
24bf0 50 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50  Pg:.**.**   1. P
24c00 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 20  agerDontWrite() 
24c10 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
24c20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 4f 52 20  on the page, OR 
24c30 0a 2a 2a 20 20 20 20 20 20 50 61 67 65 72 57 72  .**      PagerWr
24c40 69 74 65 28 29 20 68 61 73 20 6e 6f 74 20 79 65  ite() has not ye
24c50 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  t been called on
24c60 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
24c70 20 20 20 32 2e 20 54 68 65 20 70 61 67 65 20 65     2. The page e
24c80 78 69 73 74 65 64 20 77 68 65 6e 20 74 68 65 20  xisted when the 
24c90 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
24ca0 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  started..**.** D
24cb0 65 74 61 69 6c 73 3a 20 44 6f 6e 74 52 6f 6c 6c  etails: DontRoll
24cc0 62 61 63 6b 28 29 20 28 74 68 69 73 20 72 6f 75  back() (this rou
24cd0 74 69 6e 65 29 20 69 73 20 6f 6e 6c 79 20 63 61  tine) is only ca
24ce0 6c 6c 65 64 20 77 68 65 6e 20 61 20 6c 65 61 66  lled when a leaf
24cf0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 20 66   is.** removed f
24d00 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
24d10 74 2e 20 44 6f 6e 74 57 72 69 74 65 28 29 20 69  t. DontWrite() i
24d20 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
24d30 72 20 61 20 70 61 67 65 20 0a 2a 2a 20 62 65 63  r a page .** bec
24d40 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
24d50 20 6c 65 61 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73   leaf..*/.void s
24d60 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
24d70 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
24d80 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
24d90 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
24da0 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ger;..  pagerEnt
24db0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  er(pPager);.  as
24dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
24dd0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
24de0 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
24df0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24e00 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
24e10 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
24e20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a   been called on.
24e30 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28    ** this page (
24e40 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73  DontWrite() sets
24e50 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
24e60 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20  ack flag), then 
24e70 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
24e80 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
24e90 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
24ea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
24eb0 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73 52   || pPg->alwaysR
24ec0 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
24ed0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
24ee0 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c 65  k ){.    pagerLe
24ef0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
24f00 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
24f10 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
24f20 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d      /* For a mem
24f30 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  db, pPager->jour
24f40 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79  nalOpen is alway
24f50 73 20 30 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  s 0 */..  /* Che
24f60 63 6b 20 74 68 61 74 20 50 61 67 65 72 57 72 69  ck that PagerWri
24f70 74 65 28 29 20 68 61 73 20 6e 6f 74 20 79 65 74  te() has not yet
24f80 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
24f90 74 68 69 73 20 70 61 67 65 2c 20 61 6e 64 0a 20  this page, and. 
24fa0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67   ** that the pag
24fb0 65 20 65 78 69 73 74 65 64 20 77 68 65 6e 20 74  e existed when t
24fc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
24fd0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  tarted..  */.  a
24fe0 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a  ssert( !pPg->inJ
24ff0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
25000 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
25010 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
25020 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
25030 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
25040 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
25050 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
25060 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
25070 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 70  Pg->pgno&7);.  p
25080 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
25090 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  1;.  pPg->needRe
250a0 61 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ad = 0;.  if( pP
250b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
250c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
250d0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
250e0 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
250f0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  bSize );.    pPa
25100 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
25110 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
25120 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
25130 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33   }.  PAGERTRACE3
25140 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
25150 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
25160 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
25170 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
25180 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
25190 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
251a0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
251b0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
251c0 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
251d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
251e0 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
251f0 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
25200 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
25210 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
25220 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
25230 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
25240 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
25250 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
25260 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
25270 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
25280 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  t){.  PgHdr *pPg
25290 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
252a0 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
252b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
252c0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
252d0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
252e0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
252f0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
25300 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
25310 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
25320 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
25330 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
25340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25350 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25360 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73  rc;..    if( !is
25370 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Direct ){.      
25380 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25390 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
253a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
253b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
253c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
253d0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
253e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
253f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
25400 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
25410 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
25420 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
25430 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
25440 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
25450 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
25460 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
25470 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
25480 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f  rs);.    change_
25490 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70  counter++;.    p
254a0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
254b0 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
254c0 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
254d0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
254e0 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26    if( isDirect &
254f0 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
25500 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
25510 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
25520 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
25530 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
25540 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
25550 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
25560 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
25570 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
25580 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
25590 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
255a0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
255b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
255c0 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
255d0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
255e0 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
255f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25600 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
25610 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
25620 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
25630 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
25640 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
25650 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
25660 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
25670 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
25680 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
25690 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
256a0 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
256b0 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
256c0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
256d0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
256e0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
256f0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
25700 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
25710 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
25720 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
25730 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
25740 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
25750 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
25760 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
25770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25780 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
25790 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
257a0 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
257b0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
257c0 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
257d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
257e0 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
257f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
25800 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
25810 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
25820 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
25830 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
25840 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
25850 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
25860 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
25870 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
25880 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
25890 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
258a0 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
258b0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
258c0 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
258d0 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
258e0 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
258f0 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
25900 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
25910 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25920 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
25930 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
25940 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
25950 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
25960 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25970 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52  ITE_OK;..  PAGER
25980 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
25990 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
259a0 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
259b0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
259c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
259d0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
259e0 63 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  c);.  pagerEnter
259f0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
25a00 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
25a10 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
25a20 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
25a30 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
25a40 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
25a50 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
25a60 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
25a70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
25a80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
25a90 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
25aa0 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
25ab0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
25ac0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
25ad0 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51  *pPg;..#ifdef SQ
25ae0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
25af0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20  IC_WRITE.    /* 
25b00 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  The atomic-write
25b10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
25b20 6e 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  n be used if all
25b30 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
25b40 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
25b50 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
25b60 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73      + The file-s
25b70 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
25b80 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
25b90 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
25ba0 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
25bb0 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
25bc0 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
25bd0 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   + This commit i
25be0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
25bf0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
25c00 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
25c10 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20  **    + Exactly 
25c20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
25c30 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
25c40 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
25c50 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
25c60 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
25c70 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
25c80 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68  be used, then th
25c90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
25ca0 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a  ill never.    **
25cb0 20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72 20   be created for 
25cc0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
25cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
25ce0 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20   useAtomicWrite 
25cf0 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61  = (.        !zMa
25d00 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  ster && .       
25d10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25d20 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
25d30 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a  ize(pPager) && .
25d40 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d          nTrunc==
25d50 30 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 30  0 && .        (0
25d60 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ==pPager->pDirty
25d70 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 70   || 0==pPager->p
25d80 44 69 72 74 79 2d 3e 70 44 69 72 74 79 29 0a 20  Dirty->pDirty). 
25d90 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73     );.    if( us
25da0 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a  eAtomicWrite ){.
25db0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
25dc0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
25dd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25de0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  le. */.      int
25df0 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
25e00 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
25e10 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
25e20 67 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gic);.      asse
25e30 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  rt(pPager->nRec=
25e40 3d 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  =1);.      rc = 
25e50 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
25e60 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c  er->jfd, offset,
25e70 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
25e80 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
25e90 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61   the db file cha
25ea0 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65  nge counter. The
25eb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
25ec0 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20  will modify.    
25ed0 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f    ** the in-memo
25ee0 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
25ef0 6e 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69  n of page 1 to i
25f00 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74  nclude the updat
25f10 65 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e  ed.      ** chan
25f20 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
25f30 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
25f40 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
25f50 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
25f60 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  ** file. Because
25f70 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
25f80 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66  rite property of
25f90 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73   the host file-s
25fa0 79 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a  ystem, .      **
25fb0 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
25fc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
25fd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25fe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
25ff0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
26000 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
26010 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
26020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
26030 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
26040 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  lCreate(pPager->
26050 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
26060 20 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57   if( !useAtomicW
26070 72 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  rite && rc==SQLI
26080 54 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a  TE_OK ).#endif..
26090 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74      /* If a mast
260a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
260b0 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
260c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
260d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
260e0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  nal file, then n
260f0 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  o sync is requir
26100 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ed. This happens
26110 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20   when it is.    
26120 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e  ** written, then
26130 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69   the process fai
26140 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ls to upgrade fr
26150 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f  om a RESERVED to
26160 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
26170 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e  SIVE lock. The n
26180 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f  ext time the pro
26190 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f  cess tries to co
261a0 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  mmit the.    ** 
261b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20  transaction the 
261c0 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61  m-j name will ha
261d0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
261e0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
261f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
26200 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20  >setMaster ){.  
26210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
26230 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
26240 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
26250 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
26260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
26270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
26280 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66  o sync_exit;.#if
26290 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
262a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
262b0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
262c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
262d0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
262e0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
262f0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
26300 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
26310 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
26320 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
26330 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
26340 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
26350 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
26360 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
26370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26380 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
26390 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45  int iSkip = PAGE
263a0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
263b0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  );.        for( 
263c0 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
263d0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
263e0 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
263f0 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72      if( !(pPager
26400 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38  ->aInJournal[i/8
26410 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20  ] & (1<<(i&7))) 
26420 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
26430 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26440 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26450 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
26460 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26480 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
26490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
264a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
264b0 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20  rite(pPg);.     
264c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
264d0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
264e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
264f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
26500 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
26510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26520 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
26530 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
26540 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
26550 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
26560 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
26570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
26580 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
26590 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
265a0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
265b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
265c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
265d0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69  o sync_exit;..#i
265e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
265f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
26600 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
26610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
26620 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
26630 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
26640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
26650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
26660 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
26670 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
26680 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
26690 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
266a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
266b0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
266c0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
266d0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
266e0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
266f0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
26700 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26720 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 21 70  while( pPg && !p
26730 50 67 2d 3e 64 69 72 74 79 20 29 7b 20 70 50 67  Pg->dirty ){ pPg
26740 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 20   = pPg->pDirty; 
26750 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
26760 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
26770 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78      goto sync_ex
26780 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  it;.    }.    pP
26790 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
267a0 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
267b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
267c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
267d0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
267e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
267f0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
26800 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
26810 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
26820 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
26830 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
26840 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
26850 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
26860 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
26870 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
26880 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
26890 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
268a0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
268b0 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
268c0 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
268d0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
268e0 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
268f0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
26900 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
26910 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
26920 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
26930 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
26940 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
26950 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
26960 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
26970 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
26980 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
26990 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
269a0 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
269b0 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
269c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
269d0 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
269e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
269f0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
26a00 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
26a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
26a20 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
26a30 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
26a40 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
26a50 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
26a60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26a70 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
26a80 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
26a90 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
26aa0 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
26ab0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
26ac0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
26ad0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
26ae0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
26af0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
26b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
26b10 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
26b20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26b30 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
26b40 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
26b50 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
26b60 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
26b70 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
26b80 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
26b90 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
26ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26bb0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
26bc0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
26bd0 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52 54 52  ager);.  PAGERTR
26be0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
26bf0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
26c00 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
26c10 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
26c20 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
26c30 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
26c40 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
26c50 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
26c60 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
26c70 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
26c80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
26c90 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
26ca0 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
26cb0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
26cc0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
26cd0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
26ce0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
26cf0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
26d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
26d10 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
26d20 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
26d30 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
26d40 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
26d50 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
26d60 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
26d70 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
26d80 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
26d90 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
26da0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
26db0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
26dc0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
26dd0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
26de0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26df0 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
26e00 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
26e10 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
26e20 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
26e30 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
26e40 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
26e50 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
26e60 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
26e70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
26e80 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
26e90 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
26ea0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
26eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26ec0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26ed0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
26ee0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
26ef0 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  che );.  assert(
26f00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
26f10 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
26f20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
26f30 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
26f40 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
26f50 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
26f60 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
26f70 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
26f80 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26f90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
26fb0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
26fc0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
26fd0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
26fe0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
26ff0 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
27000 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
27010 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
27020 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
27030 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
27040 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
27050 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27060 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
27070 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
27080 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
27090 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
270a0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
270b0 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
270c0 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
270d0 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
270e0 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
270f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
27100 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
27110 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
27120 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
27130 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
27140 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
27150 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
27160 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
27170 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
27180 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
27190 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
271a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
271b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
271c0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
271d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
271e0 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
271f0 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
27200 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27210 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
27220 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
27230 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
27240 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
27250 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
27260 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
27270 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
27280 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
27290 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
272a0 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
272b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
272c0 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
272d0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
272e0 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
272f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27300 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
27310 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
27320 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
27330 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
27340 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
27350 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
27360 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
27370 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
27380 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
27390 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
273a0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
273b0 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
273c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
273d0 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
273e0 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
273f0 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
27400 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
27410 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
27420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27430 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
27440 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
27450 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
27460 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
27470 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
27480 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
27490 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
274a0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
274b0 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
274c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
274d0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
274e0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
274f0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
27500 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
27510 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27520 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
27530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
27540 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
27550 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
27560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
27570 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
27580 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
27590 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
275a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
275b0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
275c0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
275d0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
275e0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
275f0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
27600 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
27610 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
27620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27630 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
27640 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
27650 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
27660 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
27670 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
27680 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
27690 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
276a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
276b0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
276c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
276d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
276e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
276f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
27700 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
27710 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
27720 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
27730 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
27740 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
27750 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
27760 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c      }.    pagerL
27770 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27780 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
27790 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
277a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
277b0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
277c0 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
277d0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
277e0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
277f0 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
27800 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
27810 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
27820 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
27840 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
27850 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
27860 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
27870 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
27880 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28   /* pager_reset(
27890 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50  pPager); */.  pP
278a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
278b0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
278c0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
278d0 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
278e0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
278f0 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
27900 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
27910 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
27920 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
27930 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
27940 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
27950 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ent..  */.  rc =
27960 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
27970 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65  ger, rc);.  page
27980 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
279a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
279b0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
279c0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
279d0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
279e0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
279f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
27a00 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
27a10 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
27a20 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
27a30 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
27a40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
27a50 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
27a60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
27a70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
27a80 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
27a90 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
27aa0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
27ab0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
27ac0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
27ad0 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
27ae0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
27af0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27b00 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
27b10 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
27b20 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
27b30 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
27b40 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
27b50 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
27b60 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
27b70 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
27b80 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
27b90 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
27ba0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
27bb0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
27bc0 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
27bd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
27be0 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
27bf0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
27c00 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
27c10 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
27c20 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
27c30 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
27c40 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
27c50 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
27c60 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
27c70 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
27c80 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
27c90 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
27ca0 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
27cb0 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
27cc0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
27cd0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
27ce0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
27cf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
27d00 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
27d10 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
27d20 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
27d30 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
27d40 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
27d50 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
27d60 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
27d70 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
27d80 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
27d90 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
27da0 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42  c int pagerStmtB
27db0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
27dc0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27dd0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27de0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
27df0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27e00 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
27e10 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
27e20 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
27e30 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
27e40 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
27e50 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27e60 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
27e70 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
27e80 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
27e90 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
27ea0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
27eb0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
27ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27ed0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
27ee0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
27ef0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
27f00 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
27f10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27f20 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
27f30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
27f40 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61  rnalOpen );.  pa
27f50 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
27f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27f70 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
27f80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
27f90 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  tmt = sqlite3Mal
27fa0 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d  locZero( pPager-
27fb0 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
27fc0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
27fd0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
27fe0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
27ff0 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
28000 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
28010 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
28020 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
28030 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
28040 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
28050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
28060 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
28070 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
28080 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
28090 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
280a0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
280b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
280c0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
280d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
280e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
280f0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
28100 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28110 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
28120 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
28130 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
28140 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
28150 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
28160 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
28170 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
28180 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
28190 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
281a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
281b0 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56  ntemp(pPager->pV
281c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  fs, pPager->stfd
281d0 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a  , pPager->zStmtJ
281e0 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rnl,.           
281f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28200 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
28210 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
28220 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28230 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
28240 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
28250 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
28260 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
28270 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
28280 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
28290 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
282a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
282b0 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
282c0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
282d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
282e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
282f0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  e(pPager->aInStm
28300 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
28310 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  aInStmt = 0;.  }
28320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28330 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28340 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
28350 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28360 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
28370 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
28380 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
28390 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
283a0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
283b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
283c0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
283d0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
283e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
283f0 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
28400 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e  ager){.  pagerEn
28410 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
28420 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
28430 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
28440 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
28450 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
28460 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
28470 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28480 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
28490 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
284a0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
284b0 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
284c0 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
284d0 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67  lite3_free( pPag
284e0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
284f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
28500 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
28510 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  lse{.      for(p
28520 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
28530 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
28540 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
28550 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
28560 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
28570 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
28580 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d    pNext = pHist-
28590 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20  >pNextStmt;.    
285a0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
285b0 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  t->inStmt );.   
285c0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
285d0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
285e0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
285f0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
28600 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
28610 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
28620 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
28630 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
28640 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
28650 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
28660 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
28670 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
28680 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
28690 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
286a0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
286b0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
286c0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
286d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
286e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
286f0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
28700 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
28710 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
28720 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
28730 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28740 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
28750 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28760 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28770 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
28780 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
28790 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
287a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
287b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
287c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
287d0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
287e0 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f  *pHist;.      fo
287f0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
28800 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48  tmt; pPg; pPg=pH
28810 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  ist->pNextStmt){
28820 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d  .        pHist =
28830 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
28840 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
28850 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
28860 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
28870 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
28880 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
28890 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
288a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
288b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
288c0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
288d0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
288e0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
288f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28900 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
28910 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
28920 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
28930 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
28940 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
28950 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28960 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
28970 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
28980 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
28990 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
289a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
289b0 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
289c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
289d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
289e0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
289f0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
28a00 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28a10 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
28a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
28a30 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
28a40 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
28a50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
28a60 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
28a70 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
28a80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28a90 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
28aa0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
28ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
28ac0 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
28ad0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
28ae0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
28af0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
28b00 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
28b10 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28b20 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
28b30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
28b40 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
28b50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
28b60 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
28b70 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
28b80 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
28b90 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
28ba0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
28bb0 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
28bc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
28bd0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
28be0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28bf0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
28c00 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
28c10 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
28c20 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
28c30 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
28c40 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
28c50 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
28c60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
28c70 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
28c80 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
28c90 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
28ca0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
28cb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
28cc0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
28cd0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
28ce0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
28cf0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
28d00 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
28d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28d20 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
28d30 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
28d40 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
28d50 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
28d60 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
28d70 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
28d80 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
28d90 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
28da0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
28db0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28dc0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
28dd0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
28de0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
28df0 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
28e00 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
28e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
28e20 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
28e30 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
28e40 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
28e50 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
28e60 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
28e70 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
28e80 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
28e90 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
28ea0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
28eb0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
28ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28ed0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
28ee0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
28ef0 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
28f00 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
28f10 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
28f20 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
28f30 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
28f40 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
28f50 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
28f60 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
28f70 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
28f80 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
28f90 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
28fa0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
28fb0 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64  previous located
28fc0 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
28fd0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
28fe0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
28ff0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
29000 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
29010 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
29020 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
29030 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
29040 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
29050 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
29060 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
29070 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
29080 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
29090 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
290a0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
290b0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
290c0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
290d0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
290e0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
290f0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
29100 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
29110 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
29120 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
29130 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
29140 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
29150 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
29160 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
29170 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
29180 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
29190 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
291a0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
291b0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
291c0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
291d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
291e0 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
291f0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
29200 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29210 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
29220 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
29230 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
29240 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
29250 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69  rwritten. */.  i
29260 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
29270 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
29280 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
29290 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
292a0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
292b0 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
292c0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
292d0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
292e0 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
292f0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
29300 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
29310 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
29320 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
29330 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
29340 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
29350 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
29360 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
29370 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  nt(pPg);.  if( p
29380 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
29390 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
293a0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
293b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
293c0 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
293d0 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  )pgno>pPager->or
293e0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
293f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
29400 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
29410 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
29420 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
29430 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
29440 69 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  its hash-chain *
29450 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
29460 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
29470 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
29480 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
29490 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
294a0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
294b0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
294c0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
294d0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
294e0 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
294f0 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
29500 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
29510 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
29520 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
29530 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
29540 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
29550 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
29560 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  /.  pPg->needSyn
29570 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20  c = 0;.  pPgOld 
29580 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29590 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
295a0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
295b0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
295c0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
295d0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
295e0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
295f0 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
29600 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
29610 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67  ->needSync = pPg
29620 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20  Old->needSync;. 
29630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d   }else{.    pPg-
29640 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
29650 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
29660 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
29670 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
29680 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
29690 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
296a0 61 6c 20 3d 20 20 28 70 50 61 67 65 72 2d 3e 61  al =  (pPager->a
296b0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
296c0 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
296d0 29 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ))!=0;.  }else{.
296e0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
296f0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
29700 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
29710 63 3d 3d 30 20 7c 7c 20 28 69 6e 74 29 70 67 6e  c==0 || (int)pgn
29720 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
29730 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Size );.  }..  /
29740 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
29750 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67  e number for pPg
29760 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
29770 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68  nto the new hash
29780 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73  -chain. */.  ass
29790 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
297a0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
297b0 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26  no;.  h = pgno &
297c0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
297d0 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  1);.  if( pPager
297e0 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ->aHash[h] ){.  
297f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29800 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
29810 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
29820 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
29830 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
29840 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
29850 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
29860 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50  ->aHash[h];.  pP
29870 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
29880 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72   pPg;.  pPg->pPr
29890 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d  evHash = 0;..  m
298a0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
298b0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
298c0 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  che = 1;..  if( 
298d0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
298e0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
298f0 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
29900 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
29910 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
29920 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
29930 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
29940 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
29950 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
29960 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
29970 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
29980 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
29990 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
299a0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
299b0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61  d the .    ** Pa
299c0 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.aInJournal b
299d0 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  it has been set.
299e0 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
299f0 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f  e remedied by lo
29a00 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ading.    ** the
29a10 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
29a20 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
29a30 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
29a40 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a  .needSync flag..
29a50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
29a60 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
29a70 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
29a80 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
29a90 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
29aa0 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
29ab0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
29ac0 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
29ad0 20 69 6e 20 74 68 65 20 61 49 6e 4a 6f 75 72 6e   in the aInJourn
29ae0 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
29af0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
29b00 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
29b10 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
29b20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
29b30 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
29b40 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
29b50 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
29b60 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
29b70 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
29b80 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
29b90 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
29ba0 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
29bb0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
29bc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
29bd0 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
29be0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
29bf0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29c00 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
29c10 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
29c20 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
29c30 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
29c40 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
29c50 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
29c60 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
29c70 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
29c80 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  c;.    PgHdr *pP
29c90 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
29ca0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
29cb0 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
29cc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
29cd0 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
29ce0 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
29cf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
29d10 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
29d20 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65  rnal && (int)nee
29d30 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
29d40 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
29d50 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
29d60 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 6e 65 65 64  >aInJournal[need
29d70 53 79 6e 63 50 67 6e 6f 2f 38 5d 20 26 3d 20 7e  SyncPgno/8] &= ~
29d80 28 31 3c 3c 28 6e 65 65 64 53 79 6e 63 50 67 6e  (1<<(needSyncPgn
29d90 6f 26 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  o&7));.      }. 
29da0 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28       pagerLeave(
29db0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
29dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29dd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
29de0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
29df0 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  gHdr->needSync =
29e00 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
29e10 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
29e20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67     makeDirty(pPg
29e30 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
29e40 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
29e50 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65  dr);.  }..  page
29e60 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
29e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29e80 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
29e90 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
29ea0 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
29eb0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
29ec0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
29ed0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
29ee0 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
29ef0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g){.  return PGH
29f00 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
29f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29f20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29f30 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
29f40 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
29f50 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
29f60 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
29f70 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
29f80 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
29f90 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
29fa0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
29fb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
29fc0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
29fd0 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50  return (pPager?P
29fe0 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
29ff0 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d  g, pPager):0);.}
2a000 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
2a010 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
2a020 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
2a030 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
2a040 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
2a050 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
2a060 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
2a070 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2a080 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
2a090 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2a0a0 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
2a0b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2a0c0 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
2a0d0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
2a0e0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
2a0f0 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
2a100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2a110 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
2a120 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
2a130 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
2a140 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
2a150 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
2a160 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
2a170 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
2a180 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
2a190 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
2a1a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
2a1b0 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
2a1c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
2a1d0 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
2a1e0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
2a1f0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
2a200 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2a210 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
2a220 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
2a230 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
2a240 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2a250 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2a260 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2a270 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
2a280 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
2a290 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2a2a0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
2a2b0 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
2a2c0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
2a2d0 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
2a2e0 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
2a2f0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
2a300 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2a310 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20  Mode = eMode;.  
2a320 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
2a330 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2a340 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  eMode;.}..#ifdef
2a350 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2a360 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
2a370 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
2a380 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
2a390 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
2a3a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2a3b0 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65  agerRefdump(Page
2a3c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
2a3d0 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
2a3e0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
2a3f0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
2a400 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
2a410 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
2a420 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2a430 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a440 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
2a450 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
2a460 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
2a470 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
2a480 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
2a490 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
2a4a0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2a4b0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
2a4c0 2f 0a                                            /.