/ Hex Artifact Content
Login

Artifact 60c81c923ab40a2934fb8bc0993823e01688a3f3:


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 32  : pager.c,v 1.42
0350: 39 20 32 30 30 38 2f 30 34 2f 31 37 20 32 30 3a  9 2008/04/17 20:
0360: 35 39 3a 33 38 20 64 72 68 20 45 78 70 20 24 0a  59:38 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4000: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4010: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4020: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4030: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33  -counter */.  u3
4040: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4060: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4070: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4080: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
40a0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
40b0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
40c0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
40f0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
4100: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
4110: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4120: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
4130: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
4140: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
4150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4160: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
4170: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
4180: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
4190: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41c0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
41d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
41e0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
41f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4200: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
4210: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
4220: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
4230: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
4260: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
4270: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
4280: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
4290: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
42a0: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
42b0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
42c0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
42d0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
42e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
4300: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
4310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4320: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
4330: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
4340: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
4350: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
4360: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4370: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
4380: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
4390: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
43a0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
43b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
43d0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
43e0: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
43f0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4400: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
4410: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4430: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
4440: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
4450: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4460: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4480: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
4490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44a0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
44b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
44c0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
44d0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
44e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
44f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
4520: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
4530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4540: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
4550: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
4560: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
4570: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
4580: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
4590: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a  /.  char *zStmtJ
45a0: 72 6e 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  rnl;            
45b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
45c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
45d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
45e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
45f0: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4600: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4610: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4620: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4630: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4640: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4650: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
4660: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4670: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
4680: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4690: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
46a0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
46b0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
46c0: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
46d0: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
46e0: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
46f0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
4700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4710: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4720: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4730: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4750: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4760: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4770: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
4780: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
4790: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
47a0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
47b0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
47c0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
47d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
47e0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
47f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4830: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4840: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4850: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4870: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
4880: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
4890: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
48a0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
48c0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
48d0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
48e0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
48f0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4900: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
4910: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4920: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4930: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4940: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4950: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
4960: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
4970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4980: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
4990: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
49a0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
49b0: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
49c0: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
49d0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
49e0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
49f0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
4a00: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
4a10: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a20: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a40: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4a60: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4a70: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4a80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a90: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4aa0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4ab0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4ac0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4ad0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4ae0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4af0: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4b00: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4b10: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b30: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b40: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b50: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b70: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4b80: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4b90: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bb0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4bc0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4bd0: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4be0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4bf0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4c00: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c20: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c30: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c40: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c50: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4c70: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4c80: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d  */.  int iInUseM
4ca0: 4d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M;              
4cb0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4cc0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4cd0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73  M */.  int iInUs
4ce0: 65 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20  eDB;            
4cf0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d00: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4d10: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d20: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d30: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d40: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4d60: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4d70: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4d80: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4d90: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4da0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4db0: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4dc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4dd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4de0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4df0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4e00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4e10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4e20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4e30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4e40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4e50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4e60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4e70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4e80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4e90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4ea0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4eb0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4ec0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4ed0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4ee0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4ef0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4f00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4f10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4f20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4f30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4f50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4f60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4f70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69   to journal */.i
4f80: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f90: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20  _pgfree_count = 
4fa0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4fb0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66  of cache pages f
4fc0: 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65  reed */.# define
4fd0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
4fe0: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
4ff0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
5000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
5020: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
5030: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f  the head of a do
5040: 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  uble-linked list
5050: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72  .** of all pager
5060: 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69  s that are eligi
5070: 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65  ble for page ste
5080: 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  aling by the.** 
5090: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
50a0: 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61  memory() interfa
50b0: 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74  ce.  Access to t
50c0: 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70  his list is.** p
50d0: 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20  rotected by the 
50e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
50f0: 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a  TIC_MEM2 mutex..
5100: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5110: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5120: 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63  ANAGEMENT.static
5130: 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50   Pager *sqlite3P
5140: 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74  agerList = 0;.st
5150: 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73  atic PagerLruLis
5160: 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  t sqlite3LruPage
5170: 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  List = {0, 0, 0}
5180: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
5190: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
51a0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
51b0: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
51c0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
51d0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
51e0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
51f0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
5200: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
5210: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
5220: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
5230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
5240: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
5250: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
5260: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
5270: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
5280: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
5290: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
52a0: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
52b0: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
52c0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
52d0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
52e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
52f0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
5300: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
5310: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
5320: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
5330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
5340: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
5350: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
5360: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
5370: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
5380: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
5390: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
53a0: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
53b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
53c0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
53d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
53e0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
53f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
5400: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
5410: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
5420: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
5430: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
5440: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
5450: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
5460: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
5470: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
5480: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
5490: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
54a0: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
54b0: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
54c0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
54d0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
54e0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
54f0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
5500: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
5510: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
5520: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
5530: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
5540: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
5550: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
5560: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
5570: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5580: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
5590: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
55a0: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
55b0: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
55c0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
55d0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
55e0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
55f0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
5600: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
5610: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
5620: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
5630: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
5640: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
5650: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
5660: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
5670: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
5680: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
5690: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
56a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
56b0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
56c0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
56d0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
56e0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
56f0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
5700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
5710: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
5720: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
5730: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
5740: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
5750: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
5760: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
5770: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
5780: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
5790: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
57a0: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
57b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
57c0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
57d0: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
57e0: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
57f0: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
5800: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
5810: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
5820: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
5830: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
5840: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
5850: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
5860: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
5870: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
5880: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5890: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
58a0: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
58b0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
58c0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
58d0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
58e0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
58f0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
5900: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
5910: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
5920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5930: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
5940: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
5950: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
5960: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
5970: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
5980: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
5990: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
59a0: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
59b0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
59c0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
59d0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
59e0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
59f0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
5a00: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
5a10: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
5a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
5a30: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
5a40: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5a50: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
5a60: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
5a70: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
5a80: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
5a90: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
5aa0: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
5ab0: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
5ac0: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
5ad0: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5ae0: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
5af0: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
5b00: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
5b10: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
5b20: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
5b30: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
5b40: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
5b50: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
5b60: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
5b70: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
5b80: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47  /./* #define PAG
5b90: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50  ER_MJ_PGNO(x) (P
5ba0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5bb0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a  ->pageSize)) */.
5bc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5bd0: 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49  _PGNO(x) ((PENDI
5be0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5bf0: 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a  geSize))+1)../*.
5c00: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
5c10: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
5c20: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
5c30: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5c40: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
5c50: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
5c60: 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64  pagerEnter() and
5c70: 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f   pagerLeave() ro
5c80: 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61  utines acquire a
5c90: 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20  nd release.** a 
5ca0: 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61  mutex on each pa
5cb0: 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20  ger.  The mutex 
5cc0: 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a  is recursive..**
5cd0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70  .** This is a sp
5ce0: 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  ecial-purpose mu
5cf0: 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72  tex.  It only pr
5d00: 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78  ovides mutual ex
5d10: 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  clusion.** betwe
5d20: 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64  en the Btree and
5d30: 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61   the Memory Mana
5d40: 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72  gement sqlite3_r
5d50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a  elease_memory().
5d60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74  ** function.  It
5d70: 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e   does not preven
5d80: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5d90: 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20  two Btrees from 
5da0: 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65  accessing.** the
5db0: 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74   same pager at t
5dc0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f  he same time.  O
5dd0: 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72  ther general-pur
5de0: 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a  pose mutexes in.
5df0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
5e00: 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63  er handle that c
5e10: 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  hore..*/.#ifdef 
5e20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
5e30: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
5e40: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5e50: 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a  gerEnter(Pager *
5e60: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
5e70: 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  eDB++;.    if( p
5e80: 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d  ->iInUseMM && p-
5e90: 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a  >iInUseDB==1 ){.
5ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5eb0: 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20  tex *mutex;.    
5ec0: 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
5ed0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
5ee0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5ef0: 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70  C_MEM2);.      p
5f00: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
5f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f20: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
5f30: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73  ;.      p->iInUs
5f40: 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eDB = 1;.      s
5f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5f60: 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ve(mutex);.    }
5f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f80: 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20  iInUseMM==0 );. 
5f90: 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
5fa0: 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65   pagerLeave(Page
5fb0: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5fc0: 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73  nUseDB--;.    as
5fd0: 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44  sert( p->iInUseD
5fe0: 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  B>=0 );.  }.#els
5ff0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
6000: 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e  Enter(X).# defin
6010: 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a  e pagerLeave(X).
6020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
6030: 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  d page pPg to th
6040: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e  e end of the lin
6050: 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64  ked list managed
6060: 20 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a   by structure.**
6070: 20 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f   pList (pPg beco
6080: 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74  mes the last ent
6090: 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d  ry in the list -
60a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
60b0: 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72  ly .** used). Ar
60c0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
60d0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
60e0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
60f0: 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20   pPg->gfree,.** 
6100: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
6110: 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e  ther pPg is bein
6120: 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  g added to the p
6130: 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72  ager-specific or
6140: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c  .** global LRU l
6150: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
6160: 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65  oid listAdd(Page
6170: 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c  rLruList *pList,
6180: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
6190: 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67  Link, PgHdr *pPg
61a0: 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  ){.  pLink->pNex
61b0: 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e  t = 0;.  pLink->
61c0: 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70  pPrev = pList->p
61d0: 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Last;..#ifdef SQ
61e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
61f0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6200: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6210: 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e  Pg->free || pLin
6220: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b  k==&pPg->gfree);
6230: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
6240: 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20  =&pPg->gfree || 
6250: 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c  pList!=&sqlite3L
6260: 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e  ruPageList);.#en
6270: 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  dif..  if( pList
6280: 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ->pLast ){.    i
6290: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
62a0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
62b0: 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72  *)pPg;.    Pager
62c0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69  LruLink *pLastLi
62d0: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
62e0: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
62f0: 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66  ist->pLast)[iOff
6300: 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e  ]);.    pLastLin
6310: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a  k->pNext = pPg;.
6320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6330: 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72  ert(!pList->pFir
6340: 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  st);.    pList->
6350: 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
6360: 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73  }..  pList->pLas
6370: 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21  t = pPg;.  if( !
6380: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6390: 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64  ced && pPg->need
63a0: 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Sync==0 ){.    p
63b0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
63c0: 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ed = pPg;.  }.}.
63d0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50  ./*.** Remove pP
63e0: 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  g from the list 
63f0: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73  managed by the s
6400: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
6410: 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a   to by pList..**
6420: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69  .** Argument pLi
6430: 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20  nk should point 
6440: 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66  to either pPg->f
6450: 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65  ree or pPg->gfre
6460: 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a  e, depending .**
6470: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
6480: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
6490: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
64a0: 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c  ific or global L
64b0: 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  RU list..*/.stat
64c0: 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f  ic void listRemo
64d0: 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ve(PagerLruList 
64e0: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
64f0: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6500: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
6510: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6520: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6530: 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
6540: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
6550: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73  _MANAGEMENT.  as
6560: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6570: 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d  ->free || pLink=
6580: 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20  =&pPg->gfree);. 
6590: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
65a0: 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c  pPg->gfree || pL
65b0: 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75  ist!=&sqlite3Lru
65c0: 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69  PageList);.#endi
65d0: 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c  f..  if( pPg==pL
65e0: 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20  ist->pFirst ){. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6600: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
6610: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
6620: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a  pList->pLast ){.
6630: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74      pList->pLast
6640: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b   = pLink->pPrev;
6650: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b  .  }.  if( pLink
6660: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50  ->pPrev ){.    P
6670: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72  agerLruLink *pPr
6680: 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  evLink = (PagerL
6690: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
66a0: 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b  *)pLink->pPrev)[
66b0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65  iOff]);.    pPre
66c0: 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  vLink->pNext = p
66d0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Link->pNext;.  }
66e0: 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e  .  if( pLink->pN
66f0: 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ext ){.    Pager
6700: 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69  LruLink *pNextLi
6710: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
6720: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
6730: 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66  ink->pNext)[iOff
6740: 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e  ]);.    pNextLin
6750: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b  k->pPrev = pLink
6760: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
6770: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6780: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
6790: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c     PgHdr *p = pL
67a0: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ink->pNext;.    
67b0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
67c0: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
67d0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
67e0: 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  L = (PagerLruLin
67f0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b  k *)(&((u8 *)p)[
6800: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20  iOff]);.      p 
6810: 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pL->pNext;.   
6820: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46   }.    pList->pF
6830: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
6840: 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e    }..  pLink->pN
6850: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ext = pLink->pPr
6860: 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ev = 0;.}../* .*
6870: 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74  * Add page pPg t
6880: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  o the list of fr
6890: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
68a0: 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d   pager. If .** m
68b0: 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
68c0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73   is enabled, als
68d0: 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  o add the page t
68e0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a  o the global .**
68f0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6900: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ges..*/.static v
6910: 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50  oid lruListAdd(P
6920: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69  gHdr *pPg){.  li
6930: 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67  stAdd(&pPg->pPag
6940: 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66  er->lru, &pPg->f
6950: 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65  ree, pPg);.#ifde
6960: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6970: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
6980: 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50  T.  if( !pPg->pP
6990: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
69a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
69b0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
69c0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
69d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
69e0: 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64  RU));.    listAd
69f0: 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  d(&sqlite3LruPag
6a00: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6a10: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6a20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6a30: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6a40: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6a50: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6a60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6a70: 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67  * .** Remove pag
6a80: 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c  e pPg from the l
6a90: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
6aa0: 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69  s for the associ
6ab0: 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49  ated pager..** I
6ac0: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6ad0: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6ae0: 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20  also remove pPg 
6af0: 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20  from the global 
6b00: 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20  list.** of free 
6b10: 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
6b20: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d   void lruListRem
6b30: 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ove(PgHdr *pPg){
6b40: 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70  .  listRemove(&p
6b50: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c  Pg->pPager->lru,
6b60: 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67   &pPg->free, pPg
6b70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6b80: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
6b90: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
6ba0: 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65  !pPg->pPager->me
6bb0: 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
6bc0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6be0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6bf0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6c00: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71    listRemove(&sq
6c10: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6c20: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6c30: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
6c40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6c50: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
6c60: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6c70: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
6c80: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
6c90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ca0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66  s called just af
6cb0: 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ter the needSync
6cc0: 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63   flag has been c
6cd0: 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  leared.** from a
6ce0: 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64  ll pages managed
6cf0: 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61   by pPager (usua
6d00: 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  lly because the 
6d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
6d20: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79  has just been sy
6d30: 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65  nced). It update
6d40: 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72  s the pPager->lr
6d50: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76  u.pFirstSynced v
6d60: 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20  ariable.** and, 
6d70: 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
6d80: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6d90: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50   the sqlite3LruP
6da0: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6db0: 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65  nced.** variable
6dc0: 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
6dd0: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74   void lruListSet
6de0: 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65  FirstSynced(Page
6df0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
6e00: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6e10: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
6e20: 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66  >lru.pFirst;.#if
6e30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6e40: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6e50: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65  ENT.  if( !pPage
6e60: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6e70: 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71  PgHdr *p;.    sq
6e80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6e90: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6ea0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6eb0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6ec0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
6ed0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6ee0: 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65  irst; p && p->ne
6ef0: 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72  edSync; p=p->gfr
6f00: 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61  ee.pNext);.    a
6f10: 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d  ssert(p==pPager-
6f20: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6f30: 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c  d || p==sqlite3L
6f40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6f50: 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71  tSynced);.    sq
6f60: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6f70: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6f80: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  p;.    sqlite3_m
6f90: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6fa0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6fb0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6fc0: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65  IC_LRU));.  }.#e
6fd0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
6fe0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67  turn true if pag
6ff0: 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61  e *pPg has alrea
7000: 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
7010: 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
7020: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20  .** journal (or 
7030: 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68  statement snapsh
7040: 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ot has been crea
7050: 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20  ted, if *pPg is 
7060: 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e  part.** of an in
7070: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
7080: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
7090: 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74   pageInStatement
70a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
70b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
70c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
70d0: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
70e0: 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
70f0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
7100: 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c  )->inStmt;.  }el
7110: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  se{.    return s
7120: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
7130: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
7140: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
7150: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7160: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
7170: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
7180: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
7190: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
71a0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
71b0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
71c0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
71d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
71e0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
71f0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
7200: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
7210: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66  (N-1))==0 );.#if
7220: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  def SQLITE_MALLO
7230: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69  C_SOFT_LIMIT.  i
7240: 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73  f( N*sizeof(aHas
7250: 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c  h[0])>SQLITE_MAL
7260: 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29  LOC_SOFT_LIMIT )
7270: 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45  {.    N = SQLITE
7280: 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d  _MALLOC_SOFT_LIM
7290: 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b  IT/sizeof(aHash[
72a0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  0]);.  }.  if( N
72b0: 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  ==pPager->nHash 
72c0: 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66  ) return;.#endif
72d0: 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
72e0: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
72f0: 46 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49  FaultBenign(SQLI
7300: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
7310: 5f 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72 2d  _MALLOC, pPager-
7320: 3e 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61 48  >aHash!=0);.  aH
7330: 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ash = sqlite3Mal
7340: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
7350: 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20  aHash[0])*N );. 
7360: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e   sqlite3FaultBen
7370: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
7380: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c  INJECTOR_MALLOC,
7390: 20 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   0);.  pagerEnte
73a0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
73b0: 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20   aHash==0 ){.   
73c0: 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72   /* Failure to r
73d0: 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20  ehash is not an 
73e0: 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e  error.  It is on
73f0: 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ly a performance
7400: 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74   hit. */.    ret
7410: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
7420: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
7430: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
7440: 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70  ->nHash = N;.  p
7450: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61  Pager->aHash = a
7460: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Hash;.  for(pPg=
7470: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
7480: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
7490: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68  tAll){.    int h
74a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
74b0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gno==0 ){.      
74c0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
74d0: 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
74e0: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
74f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
7500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20  ;.    }.    h = 
7510: 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31  pPg->pgno & (N-1
7520: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7530: 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d  tHash = aHash[h]
7540: 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b  ;.    if( aHash[
7550: 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73  h] ){.      aHas
7560: 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
7570: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7580: 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b   aHash[h] = pPg;
7590: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
75a0: 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ash = 0;.  }.}..
75b0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
75c0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
75d0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
75e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
75f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
7600: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
7610: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
7620: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
7630: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
7640: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
7650: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
7660: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
7670: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
7680: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
7690: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
76a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
76b0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
76c0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
76d0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
76e0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
76f0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
7700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
7710: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
7720: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
7730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
7750: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
7760: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
7770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7780: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7790: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
77a0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
77b0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
77c0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
77d0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
77e0: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
77f0: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f  yte((u8*)A,B)../
7800: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
7810: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
7820: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
7830: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
7840: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
7850: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
7860: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7870: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7880: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
7890: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
78a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
78b0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
78c0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
78d0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
78e0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
78f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
7900: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
7910: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
7920: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
7930: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
7940: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
7950: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
7960: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
7970: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
7980: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
7990: 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  !pFd->pMethods )
79a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
79b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
79c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
79d0: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
79f0: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
7a00: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
7a10: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
7a20: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
7a30: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
7a40: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
7a50: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
7a60: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
7a70: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
7a80: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
7a90: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
7aa0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
7ab0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
7ac0: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
7ad0: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
7ae0: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
7af0: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
7b00: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b10: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
7b20: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
7b30: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
7b40: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
7b50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
7b60: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
7b70: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
7b80: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
7b90: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
7ba0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
7bb0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
7bc0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7bd0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
7be0: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
7bf0: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
7c00: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
7c10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7c20: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
7c30: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
7c40: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
7c50: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7c60: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
7c70: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
7c80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
7c90: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
7ca0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
7cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
7cc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ;        /* Page
7cd0: 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74   size */.  sqlit
7ce0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
7cf0: 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28  ager->fd;..  if(
7d00: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
7d10: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
7d20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
7d30: 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20  eristics(fd);.  
7d40: 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69    nSector = sqli
7d50: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
7d60: 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d  fd);.    nPage =
7d70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7d80: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
7d90: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
7da0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
7db0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
7dc0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7dd0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
7de0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
7df0: 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53  ethods || (dc&(S
7e00: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e10: 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26  IC|(nPage>>8))&&
7e20: 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20  nSector<=nPage) 
7e30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f  ){.    return JO
7e40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7e50: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
7e60: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
7e70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7e80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
7e90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7ea0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ld be called whe
7eb0: 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  n an error occur
7ec0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
7ed0: 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20  er.** code. The 
7ee0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
7ef0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7f00: 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
7f10: 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  re, the.** secon
7f20: 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  d the error-code
7f30: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
7f40: 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
7f50: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a   API function. .
7f60: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
7f70: 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
7f80: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
7f90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
7fa0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
7fb0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
7fc0: 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
7fd0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
7fe0: 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
7ff0: 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
8000: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
8010: 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
8020: 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f  e persisten erro
8030: 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a  r is cleared,.**
8040: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
8050: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
8060: 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
8070: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
8080: 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63  same .** error c
8090: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72  ode..**.** A per
80a0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e  sistent error in
80b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
80c0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
80d0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
80e0: 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
80f0: 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
8100: 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
8110: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
8120: 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
8130: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8140: 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
8150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
8160: 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
8170: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
8180: 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68  rror occured, th
8190: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
81a0: 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
81b0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
81c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
81d0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
81e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
81f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8200: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
8210: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
8220: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
8230: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
8240: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
8250: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
8260: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
8270: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8280: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
8290: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
82a0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
82b0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
82c0: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
82d0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
82e0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
82f0: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
8310: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
8320: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
8330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8340: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
8350: 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
8360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
8370: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8380: 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64  already unlocked
8390: 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c  , call pager_unl
83a0: 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20  ock() now to.   
83b0: 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20     ** clear the 
83c0: 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
83d0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
83e0: 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a  pager-cache is .
83f0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74        ** complet
8400: 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20  ely empty..     
8410: 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
8420: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
8430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8440: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8450: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
8460: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
8470: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
8480: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8490: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
84a0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
84b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
84c0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
84d0: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
84e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
84f0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
8500: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
8510: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
8520: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
8530: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
8540: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
8550: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
8560: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
8570: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
8580: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
8590: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
85a0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
85b0: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
85c0: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
85d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
85e0: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
85f0: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
8600: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
8610: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
8620: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
8630: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
8640: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8650: 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67            (unsig
8660: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
8670: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29  _TO_DATA(pPage))
8680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
8690: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
86a0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
86b0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
86c0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
86d0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
86e0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
86f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
8700: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
8710: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
8720: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8730: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
8740: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
8750: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
8760: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
8770: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
8780: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
8790: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
87a0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
87b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
87c0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
87d0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
87e0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
87f0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d  er->errCode || M
8800: 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72  EMDB || pPg->dir
8810: 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67  ty || .      pPg
8820: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
8830: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
8840: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
8850: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
8860: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
8870: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
8880: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
8890: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
88a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
88b0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
88c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
88d0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
88e0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
88f0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
8900: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8910: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8920: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
8930: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
8940: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
8950: 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  plied by the cal
8960: 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  ler. .**.** zMas
8970: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
8980: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
8990: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
89a0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
89b0: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
89c0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
89d0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
89e0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
89f0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
8a00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
8a10: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
8a20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
8a30: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
8a40: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
8a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8a60: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
8a70: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
8a80: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
8a90: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
8aa0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
8ab0: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
8ac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
8ad0: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
8ae0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
8af0: 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20  ** If no master 
8b00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8b10: 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61  e is present zMa
8b20: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
8b30: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
8b40: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
8b50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8b60: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
8b70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
8b80: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
8b90: 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  r, int nMaster){
8ba0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
8bb0: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
8bc0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
8bd0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
8be0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
8bf0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
8c00: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8c10: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
8c20: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
8c30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8c40: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
8c50: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
8c60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
8c70: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
8c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
8c90: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
8ca0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
8cb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8cc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8cd0: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
8ce0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
8d00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d10: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
8d20: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
8d30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8d40: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8d50: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d60: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
8d70: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
8d80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8d90: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
8db0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
8dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8dd0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
8de0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
8df0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
8e00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8e10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8e20: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
8e30: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
8e40: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
8e50: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
8e60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8e70: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
8e80: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
8e90: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
8ea0: 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[i];.   }.  if(
8eb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
8ec0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
8ed0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
8ee0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
8ef0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
8f00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
8f10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
8f20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
8f30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
8f40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
8f50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
8f60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
8f70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
8f80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
8f90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
8fa0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
8fb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
8fc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
8fd0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
8fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
9000: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
9010: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
9020: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9030: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
9040: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9050: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
9060: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
9070: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
9080: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
9090: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
90a0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
90b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
90c0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
90d0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
90e0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
90f0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9120: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
9130: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
9140: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
9150: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9160: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
9170: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
9180: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
91a0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
91b0: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
91c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
91d0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
91e0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
91f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9200: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
9210: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
9220: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
9230: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
9240: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9250: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
9260: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
9270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9280: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
9290: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
92a0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
92b0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
92c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
92d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
92e0: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
92f0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
9300: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
9310: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
9320: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
9330: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
9340: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
9350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9360: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
9370: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
9380: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9390: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
93a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
93b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
93c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
93d0: 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20 20  zeroHdr[28];..  
93e0: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
93f0: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
9400: 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  )).  rc = sqlite
9410: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9420: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
9430: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
9440: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
9450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
9460: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
9470: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
9480: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9490: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
94a0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
94b0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
94c0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94e0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
94f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
9500: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
9510: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
9520: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
9530: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
9540: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
9550: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
9560: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
9570: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
9580: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
9590: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
95a0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
95b0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
95c0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
95d0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
95e0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
95f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
9600: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
9610: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
9620: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
9630: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
9640: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
9650: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
9660: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
9670: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
9680: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
9690: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
96a0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
96b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
96c0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
96d0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68  r *pPager){.  ch
96e0: 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  ar zHeader[sizeo
96f0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9700: 2b 32 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  +20];.  int rc;.
9710: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9720: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
9730: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
9740: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9750: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d  >journalOff;.  }
9760: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
9770: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  dr(pPager);.  pP
9780: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9790: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
97a0: 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79  alOff;..  memcpy
97b0: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
97c0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
97d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
97e0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
97f0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
9800: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
9810: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
9820: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
9830: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
9840: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
9850: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
9860: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
9870: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
9880: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
9890: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
98a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
98b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
98c0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
98d0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
98e0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
98f0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
9900: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
9910: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
9920: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
9930: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
9940: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
9950: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
9960: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
9970: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
9980: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
9990: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
99a0: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
99b0: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
99c0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
99d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
99e0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
99f0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
9a00: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
9a10: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
9a20: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
9a30: 72 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  re occured whils
9a40: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
9a50: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
9a60: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
9a70: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
9a80: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
9a90: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
9aa0: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
9ab0: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
9ac0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
9ad0: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
9ae0: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
9af0: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
9b00: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
9b10: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
9b20: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
9b30: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
9b40: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
9b50: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
9b60: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
9b70: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
9b80: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
9b90: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
9ba0: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
9bb0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
9bc0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9bd0: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
9be0: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
9bf0: 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28  ->noSync);.  if(
9c00: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
9c10: 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  ) .   || (sqlite
9c20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
9c30: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
9c40: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
9c50: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
9c60: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
9c70: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9c80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9c90: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
9ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
9cb0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9cc0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9cd0: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
9ce0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
9cf0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
9d00: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
9d10: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
9d20: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
9d30: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
9d40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9d50: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
9d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
9d80: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
9d90: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
9da0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
9db0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
9dc0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9dd0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9de0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
9df0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
9e00: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
9e10: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
9e20: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
9e30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9e40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9e50: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
9e60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
9e70: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9e80: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
9e90: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
9ea0: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
9eb0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
9ec0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
9ed0: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
9ee0: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 49  geSize);.  }.  I
9ef0: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9f00: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9f10: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9f20: 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28  rnalHdr, sizeof(
9f30: 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20  zHeader))).  rc 
9f40: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9f50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
9f60: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
9f70: 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d 3e 6a  eader),pPager->j
9f80: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 70 50  ournalOff);.  pP
9f90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9fa0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
9fb0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
9fc0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9fd0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
9fe0: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
9ff0: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
a000: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
a010: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
a020: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
a030: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
a040: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
a050: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a060: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41     IOTRACE(("JTA
a070: 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  IL %p %lld\n", p
a080: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
a090: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20  ournalOff-1)).  
a0a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a0b0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
a0c0: 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20 70 50  d, "\000", 1, pP
a0d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a0e0: 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  -1);.  }.  retur
a0f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
a100: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a110: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
a120: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
a130: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
a140: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
a150: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a160: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
a170: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a180: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
a190: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
a1a0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
a1b0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
a1c0: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
a1d0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
a1e0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
a1f0: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
a200: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
a210: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
a220: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
a230: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
a240: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
a250: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
a260: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
a270: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
a280: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a290: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
a2a0: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
a2b0: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
a2c0: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
a2d0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
a2e0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
a2f0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
a300: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
a310: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
a320: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
a330: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
a340: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
a350: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
a360: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
a370: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
a380: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
a390: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
a3a0: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
a3b0: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
a3c0: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
a3d0: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
a3e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a3f0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
a400: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
a410: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
a420: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
a430: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
a440: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
a450: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
a460: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
a470: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
a480: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
a490: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
a4a0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
a4b0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
a4c0: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
a4d0: 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20  nt iPageSize;.. 
a4e0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
a4f0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
a500: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a510: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
a520: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
a530: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
a540: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a550: 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20  ;.  }.  jrnlOff 
a560: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
a570: 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71  lOff;..  rc = sq
a580: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
a590: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
a5a0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
a5b0: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28   jrnlOff);.  if(
a5c0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a5d0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69  .  jrnlOff += si
a5e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20  zeof(aMagic);.. 
a5f0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
a600: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
a610: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
a620: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
a630: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a640: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
a650: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a660: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e  jfd, jrnlOff, pN
a670: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
a680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
a690: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a6a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a6b0: 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e  Off+4, &pPager->
a6c0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66  cksumInit);.  if
a6d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a6e0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a6f0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a700: 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62  , jrnlOff+8, pDb
a710: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
a720: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a730: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a740: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a750: 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29  lOff+16, (u32 *)
a760: 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  &iPageSize);.  i
a770: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a780: 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a   .   && iPageSiz
a790: 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50  e>=512 .   && iP
a7a0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
a7b0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
a7c0: 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65    && ((iPageSize
a7d0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d  -1)&iPageSize)==
a7e0: 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20  0 .  ){.    u16 
a7f0: 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67 65  pagesize = iPage
a800: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
a810: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a820: 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
a830: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  pagesize);.  }. 
a840: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a850: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
a860: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
a870: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
a880: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
a890: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
a8a0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a8b0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a8c0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a8d0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
a8e0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
a8f0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
a900: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
a910: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
a920: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
a930: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
a940: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
a950: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
a960: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
a970: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
a980: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
a990: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
a9a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
a9b0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
a9c0: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
a9d0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
a9e0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
a9f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
aa00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
aa10: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
aa20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
aa30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
aa40: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
aa50: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
aa60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
aa70: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
aa80: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
aa90: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
aaa0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
aab0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
aac0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
aad0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
aae0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
aaf0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
ab00: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
ab10: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
ab20: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
ab30: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
ab40: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
ab50: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
ab60: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
ab70: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
ab80: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
ab90: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
aba0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
abb0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
abc0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
abd0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
abe0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
abf0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
ac00: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
ac10: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
ac20: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
ac30: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
ac40: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
ac50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
ac60: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
ac70: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
ac80: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
ac90: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
aca0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
acb0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
acc0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
acd0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
ace0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
acf0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
ad00: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ad10: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
ad20: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
ad30: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
ad40: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ad50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
ad60: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
ad70: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
ad80: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
ad90: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
ada0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
adb0: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
adc0: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
add0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
ade0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
adf0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
ae00: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
ae10: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
ae20: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
ae30: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
ae40: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
ae50: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
ae60: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
ae70: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
ae80: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
ae90: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
aea0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
aeb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
aec0: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
aed0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
aee0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
aef0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
af00: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
af10: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
af20: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
af30: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
af40: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
af50: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
af60: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
af70: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
af80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
af90: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
afa0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
afb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
afc0: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
afd0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
afe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aff0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
b000: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
b010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
b020: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
b030: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
b040: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
b050: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
b060: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
b070: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
b080: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
b090: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
b0a0: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
b0b0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
b0c0: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
b0d0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
b0e0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
b0f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b100: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b110: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
b120: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
b130: 72 6e 6c 4f 66 66 29 3b 0a 20 20 70 50 61 67 65  rnlOff);.  pPage
b140: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
b150: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
b160: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b170: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
b180: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
b190: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
b1a0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
b1b0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
b1c0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
b1d0: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
b1e0: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
b1f0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
b200: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
b210: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
b220: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
b230: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
b240: 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
b250: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
b260: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
b270: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
b280: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
b290: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
b2a0: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
b2b0: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
b2c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b2d0: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
b2e0: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
b2f0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
b300: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
b310: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
b320: 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74  pPager;.  PgHist
b330: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
b340: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
b350: 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
b360: 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  t( MEMDB );.  if
b370: 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74  ( !pHist->inStmt
b380: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b390: 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
b3a0: 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e  ==0 && pHist->pN
b3b0: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
b3c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
b3d0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48  tmt ){.      PGH
b3e0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65  DR_TO_HIST(pPage
b3f0: 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  r->pStmt, pPager
b400: 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  )->pPrevStmt = p
b410: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48  Pg;.    }.    pH
b420: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
b430: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
b440: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
b450: 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69  t = pPg;.    pHi
b460: 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  st->inStmt = 1;.
b470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e    }.}../*.** Fin
b480: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
b490: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
b4a0: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
b4b0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
b4c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
b4d0: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
b4e0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
b4f0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b500: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b510: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b520: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
b530: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
b540: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
b550: 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  .  p = pPager->a
b560: 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61  Hash[pgno & (pPa
b570: 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a  ger->nHash-1)];.
b580: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
b590: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
b5a0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
b5b0: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
b5c0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
b5d0: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
b5e0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
b5f0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
b600: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
b610: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
b620: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
b630: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
b640: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
b650: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
b660: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
b670: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
b680: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
b690: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
b6a0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
b6b0: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
b6c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b6d0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b6e0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
b6f0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
b700: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b710: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
b720: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
b730: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
b740: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49  Pg=pNext){.    I
b750: 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
b760: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b770: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
b780: 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
b790: 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
b7a0: 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70  ee_count);.    p
b7b0: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
b7c0: 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73  tAll;.    lruLis
b7d0: 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
b7e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b7f0: 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
b800: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
b810: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b820: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
b830: 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  st==0);.  assert
b840: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
b850: 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20  rstSynced==0);. 
b860: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
b870: 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20  lru.pLast==0);. 
b880: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b890: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
b8a0: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
b8b0: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
b8c0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
b8d0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
b8e0: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
b8f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
b900: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
b910: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
b920: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
b930: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
b940: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b950: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
b960: 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
b970: 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61  tly in error sta
b980: 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  te, discard the 
b990: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20  contents of .** 
b9a0: 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
b9b0: 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74  set the Pager st
b9c0: 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c  ructure internal
b9d0: 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65   state. If there
b9e0: 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a   is.** an open j
b9f0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65  ournal-file, the
ba00: 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  n the next time 
ba10: 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
ba20: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20   obtained.** on 
ba30: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28  the pager file (
ba40: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
ba50: 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69  ther process), i
ba60: 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65  t will be.** tre
ba70: 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f  ated as a hot-jo
ba80: 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
ba90: 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   back..*/.static
baa0: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
bab0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
bac0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
bad0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
bae0: 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
baf0: 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  B ){.      int r
bb00: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
bb10: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
bb20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
bb30: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
bb40: 65 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50  e = rc;.      pP
bb50: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
bb60: 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  1;.      IOTRACE
bb70: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
bb80: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20   pPager))..     
bb90: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
bba0: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
bbb0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
bbc0: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
bbd0: 6e 6f 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  not be.      ** 
bbe0: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
bbf0: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
bc00: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
bc10: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
bc20: 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65  e.      ** cache
bc30: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
bc40: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
bc50: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
bc60: 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
bc70: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
bc80: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
bc90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bca0: 45 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65  E_OK ) pPager->e
bcb0: 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
bcc0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  OK;.        page
bcd0: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
bce0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
bcf0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
bd00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
bd10: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
bd20: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20 20 20  ->stfd);.       
bd30: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
bd40: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
bd50: 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  pInStmt);.      
bd60: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53      pPager->pInS
bd70: 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
bd80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
bd90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
bda0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
bdb0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
bdc0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
bdd0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
bde0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
bdf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
be00: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
be10: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
be20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  l);.          pP
be30: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
be40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
be50: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
be60: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
be70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
be80: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
be90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
bea0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
beb0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
bec0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
bed0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bee0: 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
bef0: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
bf00: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
bf10: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
bf20: 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
bf30: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
bf40: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
bf50: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bf60: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
bf70: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67  LOCK;.      pPag
bf80: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
bf90: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  one = 0;.    }. 
bfa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
bfb0: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
bfc0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
bfd0: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
bfe0: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
bff0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
c000: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
c010: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
c020: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a   error state, .*
c030: 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * do not attempt
c040: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
c050: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c060: 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
c070: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a  back(Pager *p){.
c080: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e    /* assert( p->
c090: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
c0a0: 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72  ERVED || p->jour
c0b0: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f  nalOpen==0 ); */
c0c0: 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64  .  if( p->errCod
c0d0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e==SQLITE_OK && 
c0e0: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
c0f0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c100: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
c110: 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70  back(p);.  }.  p
c120: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a  ager_unlock(p);.
c130: 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
c140: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
c150: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
c160: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
c170: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
c180: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
c190: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
c1a0: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
c1b0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
c1c0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
c1d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c1e0: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
c1f0: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
c200: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
c210: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
c220: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
c230: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
c240: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c250: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
c260: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
c270: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
c280: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
c290: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
c2a0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
c2b0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c2c0: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
c2d0: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
c2e0: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
c2f0: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
c300: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
c310: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
c320: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
c330: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
c340: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
c350: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
c360: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
c370: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
c380: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
c390: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
c3a0: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
c3b0: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
c3c0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
c3d0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c3e0: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
c3f0: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
c400: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
c410: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
c420: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c430: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
c440: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
c450: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
c460: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
c470: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
c480: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
c490: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
c4a0: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
c4b0: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
c4c0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
c4d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
c4e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
c4f0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
c500: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c510: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
c520: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
c530: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
c540: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
c550: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
c560: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c570: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
c580: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
c590: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
c5a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
c5b0: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
c5c0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c5d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
c5e0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
c5f0: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
c600: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
c610: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
c620: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
c630: 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
c640: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
c650: 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
c660: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
c670: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c680: 5f 50 45 52 53 49 53 54 29 20 0a 20 20 20 20 20  _PERSIST) .     
c690: 20 20 26 26 20 28 72 63 20 3d 20 7a 65 72 6f 4a    && (rc = zeroJ
c6a0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
c6b0: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
c6c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c6d0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
c6e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c6f0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
c700: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c710: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c720: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
c730: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c740: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
c750: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c770: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
c780: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
c790: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
c7a0: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
c7b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
c7c0: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
c7d0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
c7e0: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
c7f0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
c800: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
c810: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
c820: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
c830: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
c840: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
c850: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
c860: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
c870: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
c880: 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52      pPg->alwaysR
c890: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66  ollback = 0;.#if
c8a0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
c8b0: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
c8c0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c8d0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
c8e0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
c8f0: 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
c900: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
c910: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
c920: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
c930: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
c940: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
c950: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c960: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
c970: 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
c980: 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
c990: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d  er->useJournal==
c9a0: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
c9b0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c9c0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
c9d0: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
c9e0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
c9f0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
ca00: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ca10: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
ca20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
ca30: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
ca40: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ca50: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
ca60: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
ca70: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ca80: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ca90: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
caa0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cab0: 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73  nc = 0;.  lruLis
cac0: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
cad0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
cae0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
caf0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
cb00: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
cb10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
cb20: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
cb30: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
cb40: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
cb50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
cb60: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
cb70: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
cb80: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
cb90: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
cba0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
cbb0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
cbc0: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
cbd0: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
cbe0: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
cbf0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
cc00: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
cc10: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
cc20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
cc30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
cc40: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
cc50: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
cc60: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
cc70: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
cc80: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
cc90: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
cca0: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
ccb0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
ccc0: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
ccd0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
cce0: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
ccf0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
cd00: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
cd10: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
cd20: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
cd30: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
cd40: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
cd50: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
cd60: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
cd70: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
cd80: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
cd90: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
cda0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
cdb0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
cdc0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
cdd0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
cde0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
cdf0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
ce00: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
ce10: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
ce20: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
ce30: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
ce40: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
ce50: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
ce60: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
ce70: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
ce80: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
ce90: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
cea0: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
ceb0: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
cec0: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
ced0: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
cee0: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
cef0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
cf00: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
cf10: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
cf20: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
cf30: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
cf40: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
cf50: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
cf60: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
cf70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
cf80: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
cf90: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
cfa0: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
cfb0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
cfc0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
cfd0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
cfe0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
cff0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
d000: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
d010: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
d020: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
d030: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
d050: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
d060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
d070: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
d080: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
d090: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
d0a0: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
d0b0: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
d0c0: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
d0d0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
d0e0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
d0f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d100: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
d110: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
d120: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
d130: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
d140: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
d150: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
d160: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
d170: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
d180: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
d190: 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66   *jfd,.  i64 off
d1a0: 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b  set,.  int useCk
d1b0: 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sum.){.  int rc;
d1c0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
d1f0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
d200: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
d210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d220: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
d230: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
d240: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
d250: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
d280: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
d290: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
d2a0: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
d2b0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
d2c0: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
d2d0: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
d2e0: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
d2f0: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
d300: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
d310: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
d320: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
d330: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
d340: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
d350: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
d360: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
d370: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
d380: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
d390: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
d3a0: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
d3b0: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
d3c0: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
d3d0: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
d3e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d3f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
d400: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d410: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
d420: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
d430: 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72  fset+4);.  if( r
d440: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d450: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
d460: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
d470: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
d480: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
d490: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
d4a0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
d4b0: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
d4c0: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
d4d0: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
d4e0: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
d4f0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
d500: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
d510: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
d520: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
d530: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
d540: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
d550: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
d560: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
d570: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
d580: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
d590: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
d5a0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
d5b0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
d5c0: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
d5d0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
d5e0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
d5f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d600: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
d610: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
d620: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
d630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
d650: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
d660: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
d670: 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e   offset+pPager->
d680: 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
d690: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
d6a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d6b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d6c0: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
d6d0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
d6e0: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
d6f0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
d700: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
d720: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d730: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
d740: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
d750: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
d760: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
d770: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d780: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
d790: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
d7a0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
d7b0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
d7c0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d7d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
d7e0: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
d7f0: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
d800: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
d810: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
d820: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
d830: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
d840: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
d850: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
d860: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
d870: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
d880: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d890: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
d8a0: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
d8b0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
d8c0: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
d8d0: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
d8e0: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
d8f0: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
d900: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
d910: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d920: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
d930: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
d940: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
d950: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
d960: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
d970: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
d980: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
d990: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
d9a0: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
d9b0: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
d9c0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
d9d0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
d9e0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
d9f0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
da00: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
da10: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
da20: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
da30: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
da40: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
da50: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
da60: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
da70: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
da80: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
da90: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
daa0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
dab0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
dac0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
dad0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
dae0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
daf0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
db00: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
db10: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
db20: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
db30: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
db40: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
db50: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
db60: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
db70: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
db80: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
db90: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
dba0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
dbb0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
dbc0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
dbd0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
dbe0: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
dbf0: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
dc00: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
dc10: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
dc20: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
dc30: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
dc40: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
dc50: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
dc60: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
dc70: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
dc80: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
dc90: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
dca0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
dcb0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
dcc0: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
dcd0: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
dce0: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
dcf0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
dd00: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
dd10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
dd20: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
dd30: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
dd40: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
dd50: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
dd60: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
dd70: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
dd80: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
dd90: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
dda0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
ddb0: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
ddc0: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
ddd0: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
dde0: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
ddf0: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
de00: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
de10: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
de20: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
de30: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
de40: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
de50: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
de60: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
de70: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
de80: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
de90: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
dea0: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
deb0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
dec0: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
ded0: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
dee0: 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52  pgno);.  PAGERTR
def0: 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE4("PLAYBACK %
df00: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
df10: 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
df20: 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
df30: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
df40: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
df50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
df60: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70  aData));.  if( p
df70: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
df80: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
df90: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
dfa0: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20 20  >needSync==0).  
dfb0: 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
dfc0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
dfd0: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
dfe0: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
dff0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e000: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e010: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e020: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
e030: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
e040: 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
e050: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
e060: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
e070: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
e080: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
e090: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
e0a0: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
e0b0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
e0c0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
e0d0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
e0e0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
e0f0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
e100: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
e110: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
e120: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
e130: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
e140: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
e150: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
e160: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
e170: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
e180: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
e190: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
e1a0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
e1b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
e1c0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
e1d0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61  *pData;.    /* a
e1e0: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
e1f0: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
e200: 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44  ==1 ); */.    pD
e210: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
e220: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
e230: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
e240: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
e250: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
e260: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
e270: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e280: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20  >xReiniter(pPg, 
e290: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e2a0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
e2b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
e2c0: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
e2d0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
e2e0: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
e2f0: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
e300: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
e310: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
e320: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
e330: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
e340: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
e350: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
e360: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
e370: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
e380: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
e390: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
e3a0: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
e3b0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
e3c0: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
e3d0: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
e3e0: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
e3f0: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
e400: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
e410: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
e420: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e430: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
e440: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
e450: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
e460: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e470: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
e480: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
e490: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
e4a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e4b0: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
e4c0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
e4d0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
e4e0: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
e4f0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
e500: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e510: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
e520: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
e530: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
e540: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
e550: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
e560: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
e570: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
e580: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
e590: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
e5a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e5b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
e5c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
e5d0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
e5e0: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
e5f0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
e600: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
e610: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
e620: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
e630: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
e640: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
e650: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
e660: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
e670: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
e680: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
e690: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
e6a0: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
e6b0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
e6c0: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
e6d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
e6e0: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
e6f0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
e700: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
e710: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e720: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
e730: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
e740: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
e750: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e760: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
e770: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
e780: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
e790: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
e7a0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
e7b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e7c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
e7d0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
e7e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
e7f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e800: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
e810: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e820: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
e830: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
e840: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
e850: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
e860: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
e870: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
e880: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
e890: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
e8a0: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
e8b0: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
e8c0: 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  _malloc(pVfs->sz
e8d0: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
e8e0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
e8f0: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
e900: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
e910: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
e920: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
e930: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e940: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
e950: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
e960: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
e970: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
e980: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
e990: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
e9a0: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
e9b0: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
e9c0: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
e9d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e9e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
e9f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
ea00: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
ea10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ea20: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
ea30: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
ea40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ea50: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
ea60: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
ea70: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
ea80: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
ea90: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
eaa0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
eab0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
eac0: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
ead0: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
eae0: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
eaf0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
eb00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
eb10: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
eb20: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
eb30: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
eb40: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
eb50: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
eb60: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
eb70: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
eb80: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
eb90: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  e3_malloc(nMaste
eba0: 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
ebb0: 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20  erPtr);.    if( 
ebc0: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
ebd0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ebe0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ebf0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ec00: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
ec10: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
ec20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
ec30: 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20  sterJournal];.  
ec40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ec50: 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
ec60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
ec70: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
ec80: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ec90: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
eca0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
ecb0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
ecc0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
ecd0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
ece0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
ecf0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
ed00: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
ed10: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
ed20: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
ed30: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
ed40: 49 53 54 53 29 3b 0a 20 20 20 20 20 20 69 66 28  ISTS);.      if(
ed50: 20 72 63 21 3d 30 20 26 26 20 72 63 21 3d 31 20   rc!=0 && rc!=1 
ed60: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ed70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ed80: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
ed90: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
eda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
edb0: 28 20 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc==1 ){.     
edc0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
edd0: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
ede0: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
edf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
ee00: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
ee10: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
ee20: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
ee30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ee40: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
ee50: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
ee60: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
ee70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ee80: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
ee90: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
eea0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
eeb0: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
eec0: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
eed0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
eee0: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
eef0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
ef00: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
ef10: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
ef20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
ef30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ef40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
ef50: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
ef60: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
ef70: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
ef80: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
ef90: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
efa0: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
efb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
efc0: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
efd0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
efe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eff0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
f000: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
f010: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
f020: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
f030: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
f040: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
f050: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
f060: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
f070: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
f080: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
f090: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
f0a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
f0b0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
f0c0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f0e0: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
f0f0: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
f100: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
f110: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
f120: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
f130: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
f140: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
f150: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
f160: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
f170: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
f180: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
f190: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
f1a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
f1b0: 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
f1c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
f1d0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
f1e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
f1f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
f200: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
f210: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a  ager *pPager);..
f220: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
f230: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
f240: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
f250: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f260: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
f270: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
f280: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
f290: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
f2a0: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
f2b0: 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  Might might be t
f2c0: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
f2d0: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
f2e0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50   smaller than nP
f2f0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  age..** This can
f300: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
f310: 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20  mple, if we are 
f320: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
f330: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
f340: 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65  * which has exte
f350: 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69  nded the file si
f360: 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70  ze and the new p
f370: 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61  ages are still a
f380: 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61  ll held.** in ca
f390: 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53  che, then an INS
f3a0: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f  ERT or UPDATE do
f3b0: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  es a statement r
f3c0: 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a  ollback.  Some.*
f3d0: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
f3e0: 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
f3f0: 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
f400: 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74  sed if you try t
f410: 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20  o.** truncate a 
f420: 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
f430: 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
f440: 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74   than it current
f450: 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74  ly is,.** so det
f460: 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
f470: 64 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20  d do not do the 
f480: 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  truncation..*/.s
f490: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
f4a0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
f4b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
f4c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
f4d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
f4e0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
f4f0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
f500: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
f510: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
f520: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
f530: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
f540: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
f550: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
f560: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
f570: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
f580: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
f590: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
f5a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f5b0: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  & currentSize>ne
f5c0: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  wSize ){.      r
f5d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
f5e0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
f5f0: 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
f600: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
f610: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f620: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f630: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
f640: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
f650: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
f660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f670: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
f680: 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20  torSize for the 
f690: 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a  given pager..**.
f6a0: 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  ** The sector si
f6b0: 7a 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 61  ze is at least a
f6c0: 73 20 62 69 67 20 61 73 20 74 68 65 20 73 65 63  s big as the sec
f6d0: 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65  tor size reporte
f6e0: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f  d.** by sqlite3O
f6f0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 20  sSectorSize().  
f700: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74  The minimum sect
f710: 6f 72 20 73 69 7a 65 20 69 73 20 35 31 32 2e 0a  or size is 512..
f720: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f730: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
f740: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
f750: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
f760: 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
f770: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
f780: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f790: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
f7a0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
f7b0: 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
f7c0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
f7d0: 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
f7e0: 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
f7f0: 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
f800: 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61  yet, in whcih ca
f810: 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
f820: 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
f830: 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
f840: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
f850: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
f860: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
f870: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
f880: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
f890: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35  er->sectorSize<5
f8a0: 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  12 ){.    pPager
f8b0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
f8c0: 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  12;.  }.}../*.**
f8d0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
f8e0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
f8f0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
f900: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
f910: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
f920: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
f930: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
f940: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
f950: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f960: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
f970: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
f980: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
f990: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
f9a0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
f9b0: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
f9c0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
f9d0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
f9e0: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
f9f0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
fa00: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
fa10: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
fa20: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
fa30: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
fa40: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
fa50: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
fa60: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
fa70: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
fa80: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
fa90: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
faa0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
fab0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
fac0: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
fad0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
fae0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
faf0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
fb00: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
fb10: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
fb20: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
fb30: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
fb40: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
fb50: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
fb60: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
fb70: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
fb80: 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
fb90: 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
fba0: 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
fbb0: 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
fbc0: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
fbd0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
fbe0: 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
fbf0: 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
fc00: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
fc10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
fc20: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
fc30: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
fc40: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
fc50: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
fc60: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
fc70: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
fc80: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
fc90: 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
fca0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
fcb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
fcc0: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
fcd0: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
fce0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
fcf0: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
fd00: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
fd10: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
fd20: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
fd30: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
fd40: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
fd50: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
fd60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
fd70: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
fd80: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
fd90: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
fda0: 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
fdb0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
fdc0: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
fdd0: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
fde0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
fdf0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
fe00: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
fe10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
fe20: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
fe30: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
fe40: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
fe50: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
fe60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fe70: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
fe80: 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
fe90: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
fea0: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
feb0: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
fec0: 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
fed0: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
fee0: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
fef0: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
ff00: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
ff10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
ff20: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
ff30: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
ff40: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
ff50: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
ff60: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
ff70: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
ff80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
ff90: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
ffa0: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
ffb0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
ffc0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
ffd0: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
ffe0: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
fff0: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
10000 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
10010 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
10020 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
10030 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
10040 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
10050 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
10060 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
10070 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
10080 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
10090 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
100a0 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
100b0 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
100c0 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
100d0 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
100e0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
100f0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
10100 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
10110 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
10120 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
10130 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
10140 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
10150 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
10160 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
10170 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
10180 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
10190 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
101a0 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
101b0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
101c0 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
101d0 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
101e0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
101f0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
10200 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
10210 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10220 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
10230 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
10240 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
10250 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
10260 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
10270 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
10280 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
10290 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
102a0 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
102b0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
102c0 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
102d0 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
102e0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
102f0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
10300 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
10310 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
10320 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
10330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
10340 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
10350 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
10360 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
10370 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
10380 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
10390 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
103a0 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
103b0 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
103c0 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
103d0 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
103e0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
103f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
10400 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
10410 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
10420 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
10430 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
10440 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10450 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
10460 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10480 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
10490 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
104a0 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
104b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
104c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
104d0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
104e0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10510 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
10520 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
10530 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10540 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
10550 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
10560 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10570 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
10580 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
10590 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
105a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
105b0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
105c0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
105d0 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
105e0 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
105f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10600 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10610 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
10620 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
10630 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
10640 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
10650 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
10660 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
10670 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
10680 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10690 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
106a0 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
106b0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
106c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
106d0 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
106e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
106f0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
10700 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
10710 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
10720 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10730 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
10740 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
10750 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
10760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10770 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
10780 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
10790 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
107a0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
107b0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
107c0 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
107d0 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
107e0 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
107f0 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a  d back..  */.  z
10800 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
10810 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
10820 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
10830 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
10840 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
10850 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
10860 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
10870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
10880 7a 4d 61 73 74 65 72 5b 30 5d 20 0a 20 20 20 26  zMaster[0] .   &
10890 26 20 28 72 65 73 3d 73 71 6c 69 74 65 33 4f 73  & (res=sqlite3Os
108a0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
108b0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
108c0 45 53 53 5f 45 58 49 53 54 53 29 29 3d 3d 30 20  ESS_EXISTS))==0 
108d0 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73  ) .  ){.    zMas
108e0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  ter = 0;.    got
108f0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10900 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
10910 30 3b 0a 20 20 69 66 28 20 72 65 73 3c 30 20 29  0;.  if( res<0 )
10920 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
10930 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
10940 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10950 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
10960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10970 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
10980 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
10990 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
109a0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
109b0 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
109c0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
109d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
109e0 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
109f0 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
10a00 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
10a10 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
10a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10a30 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
10a40 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
10a50 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
10a60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10a70 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
10a80 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
10a90 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
10aa0 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
10ab0 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
10ac0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
10ad0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
10ae0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
10af0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
10b00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
10b10 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
10b20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
10b30 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
10b40 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
10b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10b60 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
10b70 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
10b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
10b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
10ba0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
10bb0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
10bc0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
10bd0 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
10be0 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
10bf0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
10c00 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
10c10 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
10c20 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
10c30 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
10c40 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
10c50 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
10c60 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
10c70 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
10c80 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
10c90 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
10ca0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10cb0 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
10cc0 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
10cd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
10ce0 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
10cf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10d00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10d10 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
10d20 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
10d30 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
10d40 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
10d50 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
10d60 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
10d70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10d80 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
10d90 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
10da0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10db0 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
10dc0 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
10dd0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
10de0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
10df0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
10e00 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
10e10 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
10e20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
10e30 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
10e40 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
10e50 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
10e60 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
10e70 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
10e80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
10e90 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
10ea0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
10eb0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
10ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
10ed0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
10ee0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
10ef0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
10f00 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  2565..    */.   
10f10 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
10f20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
10f30 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10f40 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
10f50 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
10f60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10f70 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
10f80 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
10f90 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
10fa0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
10fb0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
10fc0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
10fd0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
10fe0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10ff0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
11000 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
11010 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
11020 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
11030 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11040 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11050 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
11060 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
11070 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11080 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11090 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
110a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
110b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
110c0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
110d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
110e0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
110f0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
11100 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
11110 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
11120 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
11130 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11140 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
11150 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11160 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11170 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11180 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11190 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
111a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
111b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
111c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
111d0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
111e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
111f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
11200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11210 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
11220 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11240 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
11250 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
11270 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
11280 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
11290 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
112a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
112b0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
112c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
112d0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
112e0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
112f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
11300 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
11310 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
11320 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
11330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11340 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
11350 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
11360 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
11370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11380 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
11390 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
113a0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
113b0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
113c0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
113d0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
113e0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
113f0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
11400 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11410 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
11420 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
11430 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
11440 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
11450 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
11460 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
11470 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
11480 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
11490 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
114a0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
114b0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
114c0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
114d0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
114e0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
114f0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
11500 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
11510 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
11520 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
11530 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
11540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
11550 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11560 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
11570 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
11580 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
11590 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
115a0 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
115b0 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
115c0 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
115d0 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
115e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
115f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11600 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11610 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
11620 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
11630 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
11640 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
11650 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
11660 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
11670 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
11680 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
11690 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
116a0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
116b0 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
116c0 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
116d0 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
116e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
116f0 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
11700 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
11710 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
11720 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11730 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
11740 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
11750 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
11780 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
11790 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
117a0 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
117b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
117c0 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
117d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
117e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
117f0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11800 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
11810 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11820 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68  Off;..  /* Set h
11830 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
11840 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65  offset just afte
11850 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
11860 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   last journal.  
11870 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ** page written 
11880 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
11890 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
118a0 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
118b0 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
118c0 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c  ion was written,
118d0 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
118e0 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
118f0 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
11900 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
11910 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
11920 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
11930 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
11940 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
11950 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
11960 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
11970 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
11980 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
11990 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
119a0 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
119b0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
119c0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
119d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
119e0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
119f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11a00 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11a10 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
11a20 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
11a30 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
11a40 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
11a50 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
11a60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11a70 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
11a80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11a90 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  en );.  nRec = p
11aa0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
11ab0 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
11ac0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
11ad0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
11ae0 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
11af0 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
11b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11b10 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
11b20 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11b30 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
11b40 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
11b50 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
11b60 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
11b70 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
11b80 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
11b90 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
11ba0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11bb0 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
11bc0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
11bd0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
11be0 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
11bf0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11c00 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11c10 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f   pPager->stfd, o
11c20 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61  ffset, 0);.    a
11c30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11c40 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
11c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11c60 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
11c70 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
11c80 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
11c90 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
11ca0 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
11cb0 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
11cc0 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
11cd0 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
11ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11cf0 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
11d00 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
11d10 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
11d20 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
11d30 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
11d40 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
11d50 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
11d60 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
11d70 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
11d80 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
11d90 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
11da0 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
11db0 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
11dc0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
11dd0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
11de0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
11df0 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
11e00 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
11e10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
11e20 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
11e30 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
11e40 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
11e50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
11e60 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
11e70 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
11e80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11e90 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
11ea0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
11eb0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
11ec0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
11ed0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
11ee0 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61  alOff, 1);.    a
11ef0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11f00 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
11f10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11f20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
11f30 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
11f40 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
11f50 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
11f60 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
11f70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
11f80 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
11f90 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
11fa0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
11fb0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
11fc0 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
11fd0 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
11fe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
12000 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12010 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
12020 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
12030 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
12040 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
12050 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
12060 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
12070 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
12080 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
12090 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
120a0 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
120b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
120c0 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
120d0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
120e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
120f0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
12100 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
12120 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
12130 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12140 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
12150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
12160 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
12170 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
12180 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12190 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
121a0 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
121b0 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
121c0 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
121d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
121e0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
121f0 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
12200 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
12210 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12220 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
12230 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
12240 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
12250 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
12260 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
12270 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
12280 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
12290 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
122a0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
122b0 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
122c0 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
122d0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
122e0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
122f0 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
12300 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
12310 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
12320 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
12330 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
12340 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
12350 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
12360 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
12370 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
12380 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
12390 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
123a0 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
123b0 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
123c0 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
123d0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
123e0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
123f0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
12400 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
12410 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
12420 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
12430 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
12440 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
12450 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
12460 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
12470 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
12480 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12490 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
124a0 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
124b0 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
124c0 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
124d0 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
124e0 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
124f0 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
12500 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
12510 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
12520 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
12530 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
12540 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
12550 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
12560 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
12570 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
12580 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12590 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
125a0 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
125b0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
125c0 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
125d0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
125e0 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
125f0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
12600 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
12610 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
12620 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
12630 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12640 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
12650 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
12660 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
12670 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
12680 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
12690 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
126a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
126b0 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
126c0 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
126d0 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
126e0 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
126f0 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
12700 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
12710 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
12720 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
12730 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
12740 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
12750 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
12760 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12770 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
12780 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
12790 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
127a0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
127b0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
127c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
127d0 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
127e0 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
127f0 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
12800 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12810 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
12820 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
12830 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
12840 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
12850 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
12860 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
12870 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
12880 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
12890 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
128a0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
128b0 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
128c0 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
128d0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
128e0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
128f0 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54  full_fsync?SQLIT
12900 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
12910 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
12920 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
12930 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
12940 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
12950 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
12970 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
12980 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
12990 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
129a0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
129b0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
129c0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
129d0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
129e0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
129f0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
12a00 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
12a10 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
12a20 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
12a30 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
12a40 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
12a50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a  emporary file. .
12a60 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
12a70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12a80 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
12a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
12aa0 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
12ab0 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
12ac0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
12ad0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
12ae0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
12af0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  the temporary.**
12b00 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
12b10 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
12b20 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
12b30 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73  gerOpentemp(.  s
12b40 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12b50 2c 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  ,    /* The virt
12b60 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
12b70 6c 61 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  layer */.  sqlit
12b80 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
12b90 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
12ba0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
12bb0 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  re */.  char *zF
12bc0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
12bd0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
12be0 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  e.  Might be NUL
12bf0 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  L */.  int vfsFl
12c00 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
12c10 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
12c20 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
12c30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12c40 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
12c50 61 6d 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65  ame!=0 );..#ifde
12c60 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
12c70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
12c80 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
12c90 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
12ca0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
12cb0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
12cc0 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
12cd0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12ce0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
12cf0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
12d00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
12d10 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
12d20 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
12d30 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
12d40 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12d50 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69  , zFilename, pFi
12d60 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
12d70 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
12d80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69  SQLITE_OK || pFi
12d90 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  le->pMethods );.
12da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12db0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12dc0 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
12dd0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
12de0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
12df0 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
12e00 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
12e10 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
12e20 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
12e30 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
12e40 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
12e50 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
12e60 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
12e70 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
12e80 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
12e90 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
12ea0 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
12eb0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
12ec0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
12ed0 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
12ee0 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
12ef0 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
12f00 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
12f10 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
12f20 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
12f30 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
12f40 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
12f50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
12f60 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
12f70 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
12f80 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
12f90 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
12fa0 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
12fb0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
12fc0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
12fd0 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
12fe0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
12ff0 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
13000 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
13010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
13020 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
13030 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13040 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
13050 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
13060 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
13070 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
13080 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
13090 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
130a0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
130b0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
130c0 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
130d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
130e0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
130f0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
13100 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
13110 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
13120 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
13130 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
13140 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
13150 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
13160 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
13170 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
13180 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
13190 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
131a0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
131b0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
131c0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
131d0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
131e0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
131f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13200 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
13210 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
13220 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
13230 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
13240 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
13250 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
13260 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
13270 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
13280 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
13290 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
132a0 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72  )!=0;.  int jour
132b0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
132c0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
132d0 28 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44  (pVfs);.  int nD
132e0 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c  efaultPage = SQL
132f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
13300 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
13310 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Pathname;.  int 
13320 6e 50 61 74 68 6e 61 6d 65 3b 0a 20 20 63 68 61  nPathname;.  cha
13330 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 0a 20 20  r *zStmtJrnl;.  
13340 69 6e 74 20 6e 53 74 6d 74 4a 72 6e 6c 3b 0a 0a  int nStmtJrnl;..
13350 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
13360 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
13370 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
13380 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
13390 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
133a0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a  ull pathname */.
133b0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
133c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
133d0 3b 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ;.  zPathname = 
133e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
133f0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 69  Pathname*2);.  i
13400 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
13410 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13420 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13430 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
13440 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
13450 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
13460 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
13470 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13480 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
13490 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
134a0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
134b0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
134c0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
134d0 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
134e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
134f0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
13500 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
13510 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
13520 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
13530 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
13540 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65  te3OsGetTempname
13550 28 70 56 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65  (pVfs, nPathname
13560 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
13570 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
13580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13590 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
135a0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
135b0 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68   rc;.  }.  nPath
135c0 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
135d0 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
135e0 50 75 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Put the statemen
135f0 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 65 6d  t journal in tem
13600 70 6f 72 61 72 79 20 64 69 73 6b 20 73 70 61 63  porary disk spac
13610 65 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 0a  e since this is.
13620 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 52    ** sometimes R
13630 41 4d 20 64 69 73 6b 20 6f 72 20 6f 74 68 65 72  AM disk or other
13640 20 6f 70 74 69 6d 69 7a 65 64 20 73 74 6f 72 61   optimized stora
13650 67 65 2e 20 20 55 6e 6c 69 6b 65 6c 79 20 74 68  ge.  Unlikely th
13660 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 61 69 6e  e main.  ** main
13670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
13680 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
13690 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  rnal does not ne
136a0 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 63  ed to be .  ** c
136b0 6f 6c 6f 63 61 74 65 64 20 77 69 74 68 20 74 68  olocated with th
136c0 65 20 64 61 74 61 62 61 73 65 20 6e 6f 72 20 64  e database nor d
136d0 6f 65 73 20 69 74 20 6e 65 65 64 20 74 6f 20 62  oes it need to b
136e0 65 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  e persistent..  
136f0 2a 2f 0a 20 20 7a 53 74 6d 74 4a 72 6e 6c 20 3d  */.  zStmtJrnl =
13700 20 26 7a 50 61 74 68 6e 61 6d 65 5b 6e 50 61 74   &zPathname[nPat
13710 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 72 63 20 3d  hname+1];.  rc =
13720 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
13730 70 6e 61 6d 65 28 70 56 66 73 2c 20 70 56 66 73  pname(pVfs, pVfs
13740 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 2c 20  ->mxPathname+1, 
13750 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 20 20 69 66  zStmtJrnl);.  if
13760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13780 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13790 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
137a0 20 7d 0a 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 3d   }.  nStmtJrnl =
137b0 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 4a 72 6e   strlen(zStmtJrn
137c0 6c 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  l);..  /* Alloca
137d0 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
137e0 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
137f0 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20  e */.  pPager = 
13800 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13810 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
13820 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
13830 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
13840 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75  cture */.    jou
13850 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
13860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
13880 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
13890 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
138a0 33 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  3 +        /* Th
138b0 65 20 6d 61 69 6e 20 64 62 20 61 6e 64 20 74 77  e main db and tw
138c0 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
138d0 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e  */ .    3*nPathn
138e0 61 6d 65 20 2b 20 34 30 20 2b 20 20 20 20 20 20  ame + 40 +      
138f0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
13900 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a  , zDirectory, zJ
13910 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 6e 53  ournal */.    nS
13920 74 6d 74 4a 72 6e 6c 20 20 20 20 20 20 20 20 20  tmtJrnl         
13930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74            /* zSt
13940 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20  mtJrnl */.  );. 
13950 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a   if( !pPager ){.
13960 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13970 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
13980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13990 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72  OMEM;.  }.  pPtr
139a0 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65 72   = (u8 *)&pPager
139b0 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  [1];.  pPager->v
139c0 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
139d0 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  gs;.  pPager->fd
139e0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
139f0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
13a00 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61  OsFile*0];.  pPa
13a10 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c  ger->stfd = (sql
13a20 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13a30 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13a40 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  1];.  pPager->jf
13a50 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
13a60 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
13a70 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50  zOsFile*2];.  pP
13a80 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
13a90 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
13aa0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b  Vfs->szOsFile*2+
13ab0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
13ac0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
13ad0 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
13ae0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
13af0 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
13b00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
13b10 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
13b20 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
13b30 0a 20 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  .  pPager->zStmt
13b40 4a 72 6e 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  Jrnl = &pPager->
13b50 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
13b60 6d 65 2b 31 30 5d 3b 0a 20 20 70 50 61 67 65 72  me+10];.  pPager
13b70 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
13b80 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13b90 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
13ba0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
13bb0 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  1);.  memcpy(pPa
13bc0 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20  ger->zStmtJrnl, 
13bd0 7a 53 74 6d 74 4a 72 6e 6c 2c 20 6e 53 74 6d 74  zStmtJrnl, nStmt
13be0 4a 72 6e 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  Jrnl+1);.  sqlit
13bf0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
13c00 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  e);..  /* Open t
13c10 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
13c20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13c30 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
13c40 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
13c50 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
13c60 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
13c70 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
13c80 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
13c90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13ca0 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
13cb0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
13cc0 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
13cd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13ce0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
13cf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
13d00 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13d30 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
13d40 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
13d50 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
13d60 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
13d70 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
13d80 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
13d90 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
13da0 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
13db0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
13dc0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13dd0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
13de0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
13df0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
13e00 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
13e10 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
13e20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
13e30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13e40 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
13e50 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
13e60 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
13e70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13e80 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
13e90 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
13ea0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
13eb0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
13ec0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
13ed0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
13ee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13ef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13f00 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
13f10 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
13f20 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
13f30 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
13f40 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
13f50 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
13f60 61 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20  age<iSectorSize 
13f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
13f80 66 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63  faultPage = iSec
13f90 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
13fa0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13fb0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
13fc0 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
13fd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
13fe0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
13ff0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
14000 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
14010 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
14020 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14030 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
14040 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
14050 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
14060 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
14070 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
14080 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
14090 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
140a0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
140b0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
140c0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
140d0 69 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b  ii=nDefaultPage;
140e0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
140f0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
14100 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
14110 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
14120 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
14130 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
14140 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
14150 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
14160 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
14170 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
14180 66 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45  faultPage>SQLITE
14190 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
141a0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
141b0 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65      nDefaultPage
141c0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
141d0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
141e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
141f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14200 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14210 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
14220 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
14230 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
14240 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
14250 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
14260 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
14270 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
14280 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
14290 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
142a0 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
142b0 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
142c0 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
142d0 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a  rite()..    */ .
142e0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
142f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
14300 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
14310 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
14320 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
14330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14340 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
14350 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ce = (char *)sql
14360 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66  ite3_malloc(nDef
14370 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  aultPage);.  }..
14380 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
14390 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
143a0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
143b0 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
143c0 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
143d0 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
143e0 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
143f0 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
14400 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
14410 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
14420 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
14430 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
14440 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
14450 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
14460 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
14470 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
14480 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14490 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
144a0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
144b0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
144c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
144d0 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
144e0 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
144f0 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
14500 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
14510 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
14520 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
14530 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
14540 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
14550 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
14560 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
14570 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
14580 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
14590 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
145a0 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
145b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
145c0 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
145d0 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
145e0 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
145f0 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
14600 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
14610 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
14620 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
14630 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
14640 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
14650 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
14660 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
14670 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
14680 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14690 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
146a0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
146b0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
146c0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
146d0 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65   9);..  /* pPage
146e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
146f0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14700 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
14710 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
14720 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
14730 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
14740 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
14750 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
14760 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
14770 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
14780 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
14790 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
147a0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
147b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
147c0 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
147d0 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61  pageSize = nDefa
147e0 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50  ultPage;.  /* pP
147f0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
14800 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14810 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
14820 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14830 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
14840 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
14850 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
14860 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
14870 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
14880 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
14890 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
148a0 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
148b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
148c0 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
148d0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
148e0 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
148f0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
14900 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
14910 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
14920 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
14930 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
14940 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
14950 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
14960 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
14970 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14980 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
14990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
149a0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
149b0 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
149c0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
149d0 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
149e0 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
149f0 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
14a00 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
14a10 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
14a20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
14a30 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
14a40 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
14a50 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
14a60 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
14a70 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14a80 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
14a90 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
14aa0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
14ab0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14ac0 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
14ad0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
14ae0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
14af0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
14b00 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
14b10 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
14b20 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
14b30 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
14b40 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
14b50 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
14b60 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74  ethods||memDb||t
14b70 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
14b80 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
14b90 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
14ba0 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
14bb0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
14bc0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
14bd0 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
14be0 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
14bf0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
14c00 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
14c10 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
14c20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
14c30 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
14c40 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
14c50 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  MM = 0;.  pPager
14c60 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
14c70 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
14c80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14c90 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
14ca0 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
14cb0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14cc0 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71  IC_MEM2);.    sq
14cd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14ce0 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50  r(mutex);.    pP
14cf0 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71  ager->pNext = sq
14d00 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a  lite3PagerList;.
14d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
14d20 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20  agerList ){.    
14d30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14d40 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65  3PagerList->pPre
14d50 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  v==0 );.      sq
14d60 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e  lite3PagerList->
14d70 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a  pPrev = pPager;.
14d80 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
14d90 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
14da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14db0 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  t = pPager;.    
14dc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14dd0 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
14de0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
14df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14e00 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
14e10 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
14e20 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
14e30 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
14e40 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
14e50 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
14e60 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
14e70 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
14e80 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
14e90 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
14ea0 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
14eb0 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
14ec0 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
14ed0 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
14ee0 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
14ef0 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
14f00 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
14f10 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
14f20 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
14f30 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
14f40 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
14f50 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
14f60 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
14f70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
14f80 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
14f90 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
14fa0 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
14fb0 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  ult sqlite3Pager
14fc0 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  Close().  .** De
14fd0 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
14fe0 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
14ff0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
15000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15010 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63  3PagerSetDestruc
15020 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
15030 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
15040 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
15050 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
15060 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
15070 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15080 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
15090 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
150a0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
150b0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
150c0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
150d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
150e0 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
150f0 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
15100 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
15110 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
15120 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
15130 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
15140 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
15150 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
15160 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
15170 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
15180 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
15190 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
151a0 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
151b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
151c0 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
151d0 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
151e0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
151f0 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
15200 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
15210 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
15220 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
15230 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69  size to *pPageSi
15240 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65  ze. If the sugge
15250 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  st new page size
15260 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72   is.** inappropr
15270 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
15280 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
15290 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
152a0 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f  at.** value befo
152b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
152c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
152d0 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
152e0 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
152f0 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69  *pPageSize){.  i
15300 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15310 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  K;.  u16 pageSiz
15320 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
15330 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
15340 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
15350 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
15360 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
15370 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
15380 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20  if( pageSize && 
15390 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
153a0 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26  ->pageSize .   &
153b0 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
153c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
153d0 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ==0 .  ){.    ch
153e0 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
153f0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
15400 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
15410 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
15420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15430 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
15440 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74  {.      pagerEnt
15450 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
15460 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
15470 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
15480 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
15490 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
154a0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
154b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
154c0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
154d0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
154e0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
154f0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
15500 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
15510 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
15520 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  }.  *pPageSize =
15530 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15540 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
15550 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15560 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
15570 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
15580 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
15590 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
155a0 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
155b0 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
155c0 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
155d0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
155e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
155f0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15600 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
15610 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
15620 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
15630 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
15640 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
15650 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
15660 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
15670 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
15680 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
15690 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
156a0 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
156b0 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
156c0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
156d0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
156e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
156f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
15700 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
15710 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
15720 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
15730 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
15740 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
15750 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
15760 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
15770 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
15780 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
15790 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
157a0 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
157b0 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
157c0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
157d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
157e0 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
157f0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
15800 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
15810 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
15820 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
15830 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
15840 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
15850 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
15860 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
15870 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
15880 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
15890 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
158a0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
158b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r);.  return pPa
158c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
158d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
158e0 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
158f0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
15900 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
15910 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
15920 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
15930 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
15940 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
15950 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
15960 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
15970 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
15980 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
15990 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
159a0 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
159b0 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
159c0 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
159d0 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
159e0 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
159f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15a00 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
15a10 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
15a20 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
15a30 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
15a40 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
15a50 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
15a60 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
15a70 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
15a80 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
15a90 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
15aa0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
15ab0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
15ac0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
15ad0 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
15ae0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
15af0 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
15b00 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
15b10 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
15b20 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
15b30 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
15b40 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
15b50 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
15b60 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
15b70 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
15b80 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
15b90 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
15ba0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15bb0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
15bc0 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
15bd0 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
15be0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
15bf0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
15c00 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
15c10 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
15c20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
15c30 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
15c40 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
15c50 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
15c60 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
15c70 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
15c80 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
15c90 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
15ca0 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
15cb0 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
15cc0 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
15cd0 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
15ce0 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
15cf0 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
15d00 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
15d10 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
15d20 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
15d30 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
15d40 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
15d50 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
15d60 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
15d70 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
15d80 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
15d90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15da0 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
15db0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15dc0 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
15dd0 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45   N);.  assert(ME
15de0 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d  MDB||pPager->fd-
15df0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
15e00 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
15e10 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
15e20 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
15e30 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
15e40 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
15e50 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
15e60 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
15e70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
15e80 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
15e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
15ea0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
15eb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15ec0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
15ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15ee0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15ef0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
15f00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
15f10 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
15f20 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
15f30 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
15f40 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
15f50 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
15f60 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
15f70 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
15f80 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
15f90 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
15fa0 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
15fb0 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
15fc0 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
15fd0 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
15fe0 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
15ff0 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
16000 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
16010 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
16020 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
16030 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
16040 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
16050 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
16060 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16070 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69    i64 n = 0;.  i
16080 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
16090 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
160a0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
160b0 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
160c0 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
160d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
160e0 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  0 ){.    n = pPa
160f0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
16100 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65   else {.    asse
16110 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
16120 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
16130 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
16140 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d  if( (pPager->fd-
16150 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20  >pMethods).     
16160 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
16170 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
16180 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c  r->fd, &n))!=SQL
16190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
161a0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
161b0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
161c0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
161d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
161e0 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  f--;.      retur
161f0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
16200 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
16210 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
16220 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
16230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
16240 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
16250 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
16260 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16270 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
16280 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
16290 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
162a0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
162b0 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
162c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
162d0 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
162e0 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e    if( n>pPager->
162f0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
16300 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e  ager->mxPgno = n
16310 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
16320 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
16330 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
16340 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
16350 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
16360 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16370 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
16380 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
16390 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
163a0 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
163b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
163c0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
163d0 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
163e0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
163f0 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   0;.}.#else.#def
16400 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79  ine clearHistory
16410 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
16420 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
16430 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
16440 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
16450 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Pager*);../*.** 
16460 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
16470 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
16480 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
16490 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
164a0 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
164b0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
164c0 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
164d0 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
164e0 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
164f0 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
16500 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
16510 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61   routine can lea
16520 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  ve a page in the
16530 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70   .** pNextFree/p
16540 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68  PrevFree list th
16550 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74  at is not a part
16560 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61   of any hash-cha
16570 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
16580 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  id unlinkHashCha
16590 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
165a0 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
165b0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
165c0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
165d0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
165e0 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
165f0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Hash==0 );.    r
16600 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
16610 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
16620 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
16630 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
16640 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
16650 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
16660 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
16670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16680 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67  r->aHash[pPg->pg
16690 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
166a0 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a  ash-1)]!=pPg );.
166b0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
166c0 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
166d0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
166e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
166f0 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
16700 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
16710 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  1);.    pPager->
16720 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
16730 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
16740 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
16750 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
16760 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
16770 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  , pPager));.  }.
16780 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
16790 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
167a0 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
167b0 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
167c0 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
167d0 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
167e0 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
167f0 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
16800 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
16810 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
16820 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
16830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
16840 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
16850 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
16860 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
16870 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  er;..  /* Unlink
16880 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20   from free page 
16890 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73  list */.  lruLis
168a0 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20  tRemove(pPg);.. 
168b0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
168c0 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
168d0 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
168e0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
168f0 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pPg);.}../*.** 
16900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16910 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
16920 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
16930 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  a database.** is
16940 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f   truncated.  Dro
16950 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  p from the cache
16960 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
16970 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67   pgno is.** larg
16980 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
16990 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
169a0 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a  referenced..**.*
169b0 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
169c0 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
169d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
169e0 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
169f0 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65  Actually, at the
16a00 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
16a10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
16a20 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e  t would be.** an
16a30 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61   error to have a
16a40 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
16a50 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68  .  But rather th
16a60 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61  an delete.** tha
16a70 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61  t page and guara
16a80 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e  ntee a subsequen
16a90 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73  t segfault, it s
16aa0 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74  eems better.** t
16ab0 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f  o zero it and ho
16ac0 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72  pe that we error
16ad0 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a   out sanely..*/.
16ae0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
16af0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
16b00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16b10 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
16b20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
16b30 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
16b40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
16b50 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
16b60 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
16b70 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
16b80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
16b90 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
16ba0 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
16bb0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
16bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
16bd0 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
16be0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
16bf0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
16c00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16c10 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
16c20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
16c30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c40 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
16c50 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54  xtAll;.      IOT
16c60 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
16c70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16c80 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
16c90 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
16ca0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
16cb0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
16cc0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
16cd0 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ;.      makeClea
16ce0 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  n(pPg);.      sq
16cf0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e  lite3_free(pPg->
16d00 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  pData);.      sq
16d10 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
16d20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16d30 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
16d40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
16d50 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
16d60 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
16d70 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
16d80 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
16d90 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
16da0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
16db0 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
16dc0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
16dd0 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
16de0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
16df0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
16e00 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
16e10 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
16e20 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
16e30 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
16e40 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
16e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16e60 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
16e70 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
16e80 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
16e90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
16ea0 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
16eb0 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
16ec0 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
16ed0 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
16ee0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
16ef0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
16f00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16f10 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
16f20 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
16f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
16f40 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
16f50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
16f60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
16f70 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
16f80 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
16f90 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
16fa0 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
16fb0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
16fc0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
16fd0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
16fe0 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
16ff0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17000 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
17010 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17020 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
17040 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61  usyHandler ) pPa
17050 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
17060 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  r->nBusy = 0;.  
17070 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
17080 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
17090 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
170a0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
170b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
170c0 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
170d0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
170e0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
170f0 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
17100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17110 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
17120 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
17130 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
17140 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
17150 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
17160 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
17170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17180 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
17190 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
171a0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
171b0 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
171c0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
171d0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
171e0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
171f0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17200 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17210 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
17220 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
17230 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17240 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
17250 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
17260 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
17270 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17280 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17290 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
172a0 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
172b0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
172c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
172d0 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
172e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
172f0 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
17300 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
17310 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
17320 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17330 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61  ITE_OK;.  }.  pa
17340 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
17350 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  ;.  rc = syncJou
17360 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
17370 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
17380 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
173a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
173b0 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
173c0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
173d0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
173e0 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
173f0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
17400 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
17410 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
17420 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
17430 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72  E_LOCK);.  pager
17440 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
17450 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17460 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17470 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
17480 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
17490 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
174a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
174b0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
174c0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
174d0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
174e0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
174f0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
17500 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17510 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
17520 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17530 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
17540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17550 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
17560 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
17570 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
17580 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
17590 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
175a0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
175b0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
175c0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
175d0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
175e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
175f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
17600 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
17610 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
17620 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17630 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
17640 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
17650 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
17660 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
17670 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
17680 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
17690 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
176a0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
176b0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
176c0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
176d0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
176e0 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
176f0 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
17700 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
17710 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
17720 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
17730 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17740 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
17750 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
17760 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71  !MEMDB ){.    sq
17770 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
17780 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
17790 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
177a0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
177b0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
177c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
177d0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  x);.    if( pPag
177e0 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  er->pPrev ){.   
177f0 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76     pPager->pPrev
17800 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72  ->pNext = pPager
17810 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
17820 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
17830 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61  3PagerList = pPa
17840 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
17850 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17860 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
17870 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e   pPager->pNext->
17880 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e  pPrev = pPager->
17890 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
178a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
178b0 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d  eave(mutex);.  }
178c0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62  .#endif..  disab
178d0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
178e0 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67  errors();.  pPag
178f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
17900 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
17910 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
17920 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17930 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  er);.  pagerUnlo
17940 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
17950 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  ager);.  enable_
17960 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
17970 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
17980 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
17990 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
179a0 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  r));.  IOTRACE((
179b0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
179c0 61 67 65 72 29 29 0a 20 20 69 66 28 20 70 50 61  ager)).  if( pPa
179d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
179e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
179f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
17a00 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
17a10 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
17a20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
17a30 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
17a40 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
17a50 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
17a60 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  e(pPager->stfd);
17a70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
17a80 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
17a90 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
17aa0 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
17ab0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
17ac0 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
17ad0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17ae0 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
17af0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
17b00 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
17b10 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
17b20 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
17b30 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
17b40 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
17b50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
17b60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
17b70 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
17b80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
17b90 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
17ba0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
17bb0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
17bc0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
17bd0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
17be0 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
17bf0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
17c00 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
17c10 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  bPage *p){.  ret
17c20 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  urn p->pgno;.}.#
17c30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
17c40 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63   page_ref() func
17c50 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  tion increments 
17c60 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
17c70 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a  unt for a page..
17c80 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69  ** If the page i
17c90 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
17ca0 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
17cb0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
17cc0 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
17cd0 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
17ce0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
17cf0 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73  *.** For non-tes
17d00 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
17d10 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f  ref() is a macro
17d20 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67   that calls _pag
17d30 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e  e_ref().** onlin
17d40 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  e of the referen
17d50 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
17d60 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74  .  For test syst
17d70 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a  ems, page_ref().
17d80 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e  ** is a real fun
17d90 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65  ction so that we
17da0 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f   can set breakpo
17db0 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69  ints and trace i
17dc0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
17dd0 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64  d _page_ref(PgHd
17de0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
17df0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
17e00 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69     /* The page i
17e10 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
17e20 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
17e30 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  move it. */.    
17e40 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
17e50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  g);.    pPg->pPa
17e60 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
17e70 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
17e80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
17e90 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
17ea0 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
17eb0 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
17ec0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
17ed0 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
17ee0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
17ef0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
17f00 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ef++;.    }.  }.
17f10 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
17f20 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
17f30 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
17f40 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
17f50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
17f60 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
17f70 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
17f80 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
17f90 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
17fa0 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
17fb0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
17fc0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
17fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
17fe0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
17ff0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d   pagerEnter(pPg-
18000 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  >pPager);.  page
18010 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 70 61 67  _ref(pPg);.  pag
18020 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50 61  erLeave(pPg->pPa
18030 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
18040 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18050 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
18060 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
18070 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
18080 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
18090 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
180a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
180b0 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
180c0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
180d0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
180e0 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
180f0 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
18100 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
18110 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
18120 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
18130 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
18140 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
18150 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
18160 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
18170 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
18180 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
18190 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
181a0 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
181b0 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
181c0 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
181d0 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
181e0 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
181f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
18200 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
18210 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
18220 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
18230 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
18240 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
18250 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
18260 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
18270 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
18280 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
18290 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
182a0 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
182b0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
182c0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
182d0 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
182e0 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
182f0 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
18300 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
18310 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
18320 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
18330 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
18340 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
18350 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
18360 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
18370 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
18380 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
18390 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
183a0 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
183b0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
183c0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
183d0 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f  re, so no sync o
183e0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ccurs..**.** If 
183f0 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
18400 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74  TIAL flag is set
18410 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74   for the persist
18420 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69  ent media on whi
18430 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ch.** the databa
18440 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68  se is stored, th
18450 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  en OsSync() is n
18460 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ever called on t
18470 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
18480 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
18490 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
184a0 75 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61  uired is to upda
184b0 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  te the nRec fiel
184c0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  d in.** the jour
184d0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  nal header..**.*
184e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
184f0 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
18500 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
18510 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
18520 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
18530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18540 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
18550 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
18560 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
18570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18580 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
18590 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
185a0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
185b0 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
185c0 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
185d0 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
185e0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
185f0 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
18600 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
18610 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20  Sync ){.    if( 
18620 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
18630 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
18640 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
18650 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
18660 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
18670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18690 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  en );..      if(
186a0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
186b0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
186c0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
186d0 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
186e0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
186f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
18700 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
18710 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
18720 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
18730 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
18740 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
18750 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
18760 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
18770 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
18780 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
18790 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
187a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
187b0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
187c0 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
187d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
187e0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
187f0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
18800 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
18810 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
18820 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
18830 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
18840 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
18850 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
18860 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
18870 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
18880 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
18890 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
188a0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
188b0 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
188c0 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
188d0 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
188e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
188f0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
18900 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
18910 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
18920 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18930 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66       i64 jrnlOff
18940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
18950 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
18960 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
18970 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
18980 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
18990 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
189a0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
189b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
189c0 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
189d0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
189e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
189f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
18a00 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
18a10 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
18a20 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
18a30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
18a40 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
18a50 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
18a60 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61     jrnlOff = pPa
18a70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
18a80 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
18a90 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20  lMagic);.       
18aa0 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
18ab0 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
18ac0 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20  Pager, jrnlOff, 
18ad0 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  4));.        rc 
18ae0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
18af0 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
18b00 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ff, pPager->nRec
18b10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18b20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
18b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18b40 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
18b50 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
18b60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
18b70 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
18b80 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
18b90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18ba0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
18bb0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
18bc0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
18bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18be0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
18bf0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
18c00 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
18c10 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
18c20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
18c30 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
18c40 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
18c50 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
18c60 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
18c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18c80 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
18c90 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
18ca0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
18cb0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
18cc0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
18cd0 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
18ce0 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
18cf0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
18d00 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
18d10 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
18d20 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
18d30 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
18d40 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
18d50 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73    lruListSetFirs
18d60 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b  tSynced(pPager);
18d70 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
18d80 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
18d90 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
18da0 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
18db0 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
18dc0 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
18dd0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
18de0 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
18df0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
18e00 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
18e10 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
18e20 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
18e30 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
18e40 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
18e50 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
18e60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
18e70 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
18e80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18e90 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
18ea0 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
18eb0 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29 3b 0a  ->lru.pFirst );.
18ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
18ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18ee0 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74  * Merge two list
18ef0 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65  s of pages conne
18f00 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61  cted by pDirty a
18f10 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72  nd in pgno order
18f20 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68  ..** Do not both
18f30 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65   fixing the pPre
18f40 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  vDirty pointers.
18f50 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
18f60 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74   *merge_pagelist
18f70 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64  (PgHdr *pA, PgHd
18f80 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20  r *pB){.  PgHdr 
18f90 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a  result, *pTail;.
18fa0 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c    pTail = &resul
18fb0 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26  t;.  while( pA &
18fc0 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20  & pB ){.    if( 
18fd0 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e  pA->pgno<pB->pgn
18fe0 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  o ){.      pTail
18ff0 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
19000 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b       pTail = pA;
19010 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
19020 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
19030 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
19040 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20  pDirty = pB;.   
19050 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20     pTail = pB;. 
19060 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44       pB = pB->pD
19070 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
19080 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
19090 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
190a0 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pA;.  }else if( 
190b0 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pB ){.    pTail-
190c0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
190d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c  }else{.    pTail
190e0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
190f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
19100 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  t.pDirty;.}../*.
19110 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74  ** Sort the list
19120 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63   of pages in acc
19130 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
19140 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65  pgno.  Pages are
19150 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  .** connected by
19160 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73   pDirty pointers
19170 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74  .  The pPrevDirt
19180 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  y pointers are.*
19190 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74  * corrupted by t
191a0 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65  his sort..*/.#de
191b0 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
191c0 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66  ET_ALLOC 25.#def
191d0 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
191e0 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64 65  T       25.#ifde
191f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
19200 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
19210 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20  r_n_sort_bucket 
19220 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f  = 0;.  #undef N_
19230 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64  SORT_BUCKET.  #d
19240 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
19250 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65  KET \.   (sqlite
19260 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
19270 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61  ucket?sqlite3_pa
19280 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
19290 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  t:N_SORT_BUCKET_
192a0 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74  ALLOC).#endif.st
192b0 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74  atic PgHdr *sort
192c0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
192d0 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a  *pIn){.  PgHdr *
192e0 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  a[N_SORT_BUCKET_
192f0 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e  ALLOC], *p;.  in
19300 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c  t i;.  memset(a,
19310 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a   0, sizeof(a));.
19320 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a    while( pIn ){.
19330 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20      p = pIn;.   
19340 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79   pIn = p->pDirty
19350 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
19360 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
19370 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
19380 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  T-1; i++){.     
19390 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a   if( a[i]==0 ){.
193a0 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70          a[i] = p
193b0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
193c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
193d0 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f        p = merge_
193e0 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
193f0 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  );.        a[i] 
19400 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
19410 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f   }.    if( i==N_
19420 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b  SORT_BUCKET-1 ){
19430 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61  .      /* Covera
19440 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c  ge: To get here,
19450 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62   there need to b
19460 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b  e 2^(N_SORT_BUCK
19470 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c  ET) .      ** el
19480 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
19490 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69  put list. This i
194a0 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20  s possible, but 
194b0 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20  impractical..   
194c0 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68     ** Testing th
194d0 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70  is line is the p
194e0 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76  oint of global v
194f0 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
19500 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
19510 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20  _sort_bucket..  
19520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69      */.      a[i
19530 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  ] = merge_pageli
19540 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
19550 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30   }.  }.  p = a[0
19560 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ];.  for(i=1; i<
19570 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69  N_SORT_BUCKET; i
19580 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72  ++){.    p = mer
19590 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61  ge_pagelist(p, a
195a0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
195b0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
195c0 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
195d0 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
195e0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
195f0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
19600 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
19610 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
19620 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
19630 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
19640 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
19650 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
19660 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
19670 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
19680 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
19690 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67 48 64   *pPager;.  PgHd
196a0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  r *p;.  int rc;.
196b0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
196c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
196d0 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
196e0 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
196f0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
19700 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
19710 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
19720 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
19730 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
19740 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
19750 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
19760 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
19770 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
19780 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
19790 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
197a0 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
197b0 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
197c0 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
197d0 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
197e0 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
197f0 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
19800 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
19810 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
19820 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
19830 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
19840 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
19850 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
19860 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19870 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
19880 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
19890 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
198a0 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
198b0 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
198c0 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
198d0 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
198e0 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
198f0 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
19900 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
19910 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
19920 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
19930 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
19940 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
19950 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
19960 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
19970 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
19980 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
19990 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
199a0 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
199b0 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
199c0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
199d0 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
199e0 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
199f0 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
19a00 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
19a10 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
19a20 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
19a30 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
19a40 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
19a50 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
19a60 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
19a70 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
19a80 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
19a90 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
19aa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
19ac0 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70    pList = sort_p
19ad0 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a  agelist(pList);.
19ae0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
19af0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
19b00 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
19b10 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e 64  irty );.    p->d
19b20 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
19b30 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
19b40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
19b50 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
19b60 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
19b70 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20  n it now. */.   
19b80 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
19b90 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
19ba0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
19bb0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
19bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19bd0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
19be0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
19bf0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
19c00 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
19c30 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  r->vfsFlags);.  
19c40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
19c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
19c60 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
19c70 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
19c80 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
19c90 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
19ca0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
19cb0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
19cc0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
19cd0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
19ce0 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
19cf0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
19d00 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
19d10 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
19d20 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
19d30 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
19d40 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
19d50 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
19d60 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
19d70 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
19d80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
19d90 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
19da0 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e  et = (pList->pgn
19db0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
19dc0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
19dd0 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
19de0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50  CODEC2(pPager, P
19df0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
19e00 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
19e10 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45  , 6);.      PAGE
19e20 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20 25  RTRACE4("STORE %
19e30 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
19e40 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
19e50 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
19e60 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
19e70 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  st->pgno, pager_
19e80 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
19e90 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
19ea0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
19eb0 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  , pPager, pList-
19ec0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
19ed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19ee0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
19ef0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
19f00 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
19f10 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
19f20 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
19f30 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
19f40 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
19f50 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
19f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
19f70 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  t->pgno==1 ){.  
19f80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
19f90 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19fa0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
19fb0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
19fc0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
19fd0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
19fe0 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
19ff0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1a000 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
1a010 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1a020 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
1a030 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
1a040 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1a050 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1a060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1a070 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
1a080 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
1a090 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1a0a0 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
1a0b0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
1a0c0 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
1a0d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
1a0f0 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
1a100 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
1a110 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
1a120 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1a130 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
1a140 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
1a150 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
1a160 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
1a170 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
1a180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
1a190 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
1a1a0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
1a1b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 23 69  er *pPager){..#i
1a1c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
1a1d0 2a 20 56 65 72 69 66 79 20 74 68 65 20 73 61 6e  * Verify the san
1a1e0 69 74 79 20 6f 66 20 74 68 65 20 64 69 72 74 79  ity of the dirty
1a1f0 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20 61 72   list when we ar
1a200 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20 69  e running.  ** i
1a210 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f 64 65  n debugging mode
1a220 2e 20 20 54 68 69 73 20 69 73 20 65 78 70 65 6e  .  This is expen
1a230 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 0a  sive, so do not.
1a240 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f 6e 20    ** do this on 
1a250 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 20  a normal build. 
1a260 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20 30 3b  */.  int n1 = 0;
1a270 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b 0a 20  .  int n2 = 0;. 
1a280 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66 6f 72   PgHdr *p;.  for
1a290 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
1a2a0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
1a2b0 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72 74 79  l){ if( p->dirty
1a2c0 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f 72   ) n1++; }.  for
1a2d0 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74  (p=pPager->pDirt
1a2e0 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  y; p; p=p->pDirt
1a2f0 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61 73  y){ n2++; }.  as
1a300 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29 3b 0a  sert( n1==n2 );.
1a310 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1a320 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
1a330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a340 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 61   1 if there is a
1a350 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
1a360 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
1a370 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  .** A hot journa
1a380 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65  l is one that ne
1a390 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
1a3a0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
1a3b0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1a3c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a3d0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
1a3e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1a3f0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
1a400 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
1a410 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
1a420 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
1a430 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
1a440 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
1a450 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65   Just delete the
1a460 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1a470 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
1a480 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 74  if unable to det
1a490 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 74 75  ermine the statu
1a4a0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1a4b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a4c0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
1a4d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a4e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a4f0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1a500 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
1a510 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  ( !pPager->useJo
1a520 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  urnal ) return 0
1a530 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1a540 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 20  >fd->pMethods ) 
1a550 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
1a560 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1a570 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1a580 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a590 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b 0a  ACCESS_EXISTS);.
1a5a0 20 20 69 66 28 20 72 63 3c 3d 30 20 29 7b 0a 20    if( rc<=0 ){. 
1a5b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a5c0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
1a5d0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
1a5e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
1a5f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1a600 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1a610 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1a620 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20  pPager)==0 ){.  
1a630 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1a640 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
1a650 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
1a660 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1a670 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1a680 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
1a690 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61  Try to find a pa
1a6a0 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
1a6b0 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79  that can be recy
1a6c0 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  cled. .**.** Thi
1a6d0 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  s routine may re
1a6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a6f0 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f  R, SQLITE_FULL o
1a700 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20  r SQLITE_OK. It 
1a710 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74  .** does not set
1a720 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
1a730 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  Code variable..*
1a740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a750 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72  er_recycle(Pager
1a760 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
1a770 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
1a780 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
1a790 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   0;..  /* It is 
1a7a0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
1a7b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e  this function un
1a7c0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 6f  less the pager o
1a7d0 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e 74  bject.  ** point
1a7e0 65 64 20 74 6f 20 62 79 20 70 50 61 67 65 72 20  ed to by pPager 
1a7f0 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  has at least one
1a800 20 66 72 65 65 20 70 61 67 65 20 28 70 61 67 65   free page (page
1a810 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e 0a   with nRef==0)..
1a820 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 21    */ .  assert(!
1a830 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72 74  MEMDB);.  assert
1a840 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
1a850 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  rst);..  /* Find
1a860 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
1a870 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
1a880 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
1a890 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
1a8a0 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
1a8b0 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
1a8c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
1a8d0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1a8e0 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  u.pFirstSynced;.
1a8f0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c  .  /* If we coul
1a900 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
1a910 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1a920 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
1a930 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a  ().  ** on the j
1a940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1a950 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
1a960 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
1a970 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c  s a.  ** very sl
1a980 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
1a990 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
1a9a0 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
1a9b0 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69  sometimes.  ** i
1a9c0 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
1a9d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1a9e0 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  g==0 && pPager->
1a9f0 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20 20  lru.pFirst){.   
1aa00 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1aa10 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1aa20 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1aa30 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72  ->fd);.    int r
1aa40 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1aa50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1aa60 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1aa70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1aa80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1aa90 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1aaa0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1aab0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1aac0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
1aad0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
1aae0 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
1aaf0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
1ab00 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
1ab10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
1ab20 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
1ab30 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
1ab40 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
1ab50 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
1ab60 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
1ab70 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
1ab80 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
1ab90 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1aba0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1abb0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
1abc0 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
1abd0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
1abe0 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
1abf0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
1ac00 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
1ac10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1ac20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
1ac30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1ac40 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
1ac50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1ac60 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1ac70 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
1ac80 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1ac90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1aca0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1acb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1acc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1acd0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
1ace0 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  ru.pFirst;.  }..
1acf0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1ad00 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
1ad10 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
1ad20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1ad30 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
1ad40 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
1ad50 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
1ad60 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
1ad70 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
1ad80 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
1ad90 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1ada0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1adb0 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1adc0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1add0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1ade0 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
1adf0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1ae00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ae10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ae20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ae30 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1ae40 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
1ae50 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1ae60 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
1ae70 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
1ae80 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
1ae90 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
1aea0 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
1aeb0 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
1aec0 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
1aed0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
1aee0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1aef0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
1af00 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
1af10 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
1af20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
1af30 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
1af40 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1af50 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
1af60 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
1af70 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
1af80 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
1af90 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
1afa0 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
1afb0 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
1afc0 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
1afd0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
1afe0 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
1aff0 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
1b000 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
1b010 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
1b020 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
1b030 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1b040 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
1b050 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
1b060 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
1b070 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b080 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1b090 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
1b0a0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
1b0b0 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
1b0c0 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
1b0d0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
1b0e0 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
1b0f0 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74  e(pPg);.  assert
1b100 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
1b110 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
1b120 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b130 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1b140 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1b150 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
1b160 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1b170 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1b180 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75   free superfluou
1b190 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  s dynamically al
1b1a0 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
1b1b0 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61  * held by the pa
1b1c0 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f  ger system. Memo
1b1d0 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79  ry in use by any
1b1e0 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c   SQLite pager al
1b1f0 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
1b200 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
1b210 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f   may be sqlite3_
1b220 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  free()ed..**.** 
1b230 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
1b240 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
1b250 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
1b260 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
1b270 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
1b280 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
1b290 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72  n returns. The r
1b2a0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1b2b0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1b2c0 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20  .** of bytes of 
1b2d0 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e  memory released.
1b2e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b2f0 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72  agerReleaseMemor
1b300 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69  y(int nReq){.  i
1b310 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
1b320 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;          /* By
1b330 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
1b340 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  leased so far */
1b350 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b360 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f   *mutex;       /
1b370 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78  * The MEM2 mutex
1b380 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
1b390 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1b3a0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1b3b0 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a   over pagers */.
1b3c0 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 73    BusyHandler *s
1b3d0 61 76 65 64 42 75 73 79 3b 20 20 20 20 20 2f 2a  avedBusy;     /*
1b3e0 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66 20 74   Saved copy of t
1b3f0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1b400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1b410 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41  LITE_OK;..  /* A
1b420 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72  cquire the memor
1b430 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74  y-management mut
1b440 65 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20  ex.  */.  mutex 
1b450 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1b460 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1b470 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
1b480 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b490 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a  _enter(mutex);..
1b4a0 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20    /* Signal all 
1b4b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1b4c0 69 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  ions that memory
1b4d0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74   management want
1b4e0 73 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61  s.  ** to have a
1b4f0 63 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67  ccess to the pag
1b500 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ers..  */.  for(
1b510 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61  pPager=sqlite3Pa
1b520 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b  gerList; pPager;
1b530 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
1b540 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61  pNext){.     pPa
1b550 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
1b560 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  1;.  }..  while(
1b570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b580 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65  & (nReq<0 || nRe
1b590 6c 65 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a  leased<nReq) ){.
1b5a0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1b5b0 20 20 20 20 50 67 48 64 72 20 2a 70 52 65 63 79      PgHdr *pRecy
1b5c0 63 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54  cled;. .    /* T
1b5d0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
1b5e0 65 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61  e to recycle tha
1b5f0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
1b600 72 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a  re a sync(). If.
1b610 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e      ** this is n
1b620 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e  ot possible, fin
1b630 64 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20  d one that does 
1b640 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29  require a sync()
1b650 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1b660 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b670 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
1b680 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b690 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1b6a0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1b6b0 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
1b6c0 72 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77  rstSynced;.    w
1b6d0 68 69 6c 65 28 20 70 50 67 20 26 26 20 28 70 50  hile( pPg && (pP
1b6e0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70  g->needSync || p
1b6f0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55  Pg->pPager->iInU
1b700 73 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70  seDB) ){.      p
1b710 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e  Pg = pPg->gfree.
1b720 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1b730 20 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20   if( !pPg ){.   
1b740 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1b750 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
1b760 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  st;.      while(
1b770 20 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61   pPg && pPg->pPa
1b780 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b  ger->iInUseDB ){
1b790 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
1b7a0 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1b7b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b7c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1b7d0 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
1b7e0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1b7f0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
1b800 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  RU));..    /* If
1b810 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68   pPg==0, then th
1b820 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61  e block above ha
1b830 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64  s failed to find
1b840 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a   a page to.    *
1b850 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68  * recycle. In th
1b860 69 73 20 63 61 73 65 20 72 65 74 75 72 6e 20 65  is case return e
1b870 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65  arly - no furthe
1b880 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20  r memory will.  
1b890 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
1b8a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b8b0 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a   !pPg ) break;..
1b8c0 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
1b8d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73  ->pPager;.    as
1b8e0 73 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53  sert(!pPg->needS
1b8f0 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1b900 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b  er->lru.pFirst);
1b910 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d  .    assert(pPg-
1b920 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1b930 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
1b940 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a  irstSynced);.  .
1b950 20 20 20 20 73 61 76 65 64 42 75 73 79 20 3d 20      savedBusy = 
1b960 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1b970 64 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  dler;.    pPager
1b980 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
1b990 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1b9a0 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1b9b0 72 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b 0a  r, &pRecycled);.
1b9c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1b9d0 79 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65 64  yHandler = saved
1b9e0 42 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72 74  Busy;.    assert
1b9f0 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20  (pRecycled==pPg 
1ba00 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
1ba10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ba20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ba30 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
1ba40 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
1ba50 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1ba60 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
1ba70 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76   .      ** remov
1ba80 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
1ba90 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65   hash-table, fre
1baa0 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65  e-list and synce
1bab0 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  d-list .      **
1bac0 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
1bad0 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
1bae0 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
1baf0 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
1bb00 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66    ** Remove it f
1bb10 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65  rom this list be
1bb20 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20  fore freeing..  
1bb30 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1bb40 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20  Todo: Check the 
1bb50 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74  Pager.pStmt list
1bb60 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1bb70 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20  is is Ok. It .  
1bb80 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
1bb90 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20  is though..     
1bba0 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20   */.      PgHdr 
1bbb0 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  *pTmp;.      ass
1bbc0 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ert( pPg );.    
1bbd0 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
1bbe0 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
1bbf0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
1bc00 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
1bc10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bc20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
1bc30 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1bc40 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
1bc50 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
1bc60 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20  NextAll ){}.    
1bc70 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
1bc80 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
1bc90 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1bca0 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28    nReleased += (
1bcb0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
1bcc0 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
1bcd0 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
1bce0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
1bcf0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
1bd00 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20  tra.          + 
1bd10 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
1bd20 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29  istory) .      )
1bd30 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1bd40 28 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a  ("PGFREE %p %d *
1bd50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1bd60 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
1bd70 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1bd80 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
1bd90 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  count);.      sq
1bda0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e  lite3_free(pPg->
1bdb0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  pData);.      sq
1bdc0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
1bdd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1bde0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73  Page--;.    }els
1bdf0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  e{.      /* An e
1be00 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
1be10 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
1be20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1be30 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   or .      ** jo
1be40 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
1be50 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
1be60 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
1be70 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
1be80 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74    ** caller of t
1be90 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
1bea0 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50  stead, set the P
1beb0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72  ager.errCode var
1bec0 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  iable..      ** 
1bed0 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
1bee0 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
1bef0 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
1bf00 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
1bf10 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
1bf20 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
1bf30 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
1bf40 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
1bf50 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
1bf60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1bf70 28 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26  (.          (rc&
1bf80 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
1bf90 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ERR ||.         
1bfa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
1bfb0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63   ||.          rc
1bfc0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  ==SQLITE_BUSY.  
1bfd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
1bfe0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1bff0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1c000 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ED );.      page
1c010 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1c020 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1c030 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d    /* Clear the m
1c040 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1c050 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61   flags and relea
1c060 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a  se the mutex.  *
1c070 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73  /.  for(pPager=s
1c080 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
1c090 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d   pPager; pPager=
1c0a0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
1c0b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e       pPager->iIn
1c0c0 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20  UseMM = 0;.  }. 
1c0d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c0e0 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20  eave(mutex);..  
1c0f0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  /* Return the nu
1c100 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1c110 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65  leased.  */.  re
1c120 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a  turn nReleased;.
1c130 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1c140 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1c150 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a  _MANAGEMENT */..
1c160 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1c170 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70  ontent of page p
1c180 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c190 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1c1a0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1c1b0 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  bPage(Pager *pPa
1c1c0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c  ger, PgHdr *pPg,
1c1d0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
1c1e0 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66  nt rc;.  i64 off
1c1f0 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  set;.  assert( M
1c200 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73  EMDB==0 );.  ass
1c210 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
1c220 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
1c230 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
1c240 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1c250 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1c260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c270 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1c280 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28    }.  offset = (
1c290 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1c2a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1c2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1c2c0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1c2d0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1c2e0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1c2f0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
1c300 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1c310 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1c320 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1c330 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1c340 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1c350 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1c360 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1c370 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1c380 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  {.    memcpy(&pP
1c390 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c3a0 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54  , &((u8*)PGHDR_T
1c3b0 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d  O_DATA(pPg))[24]
1c3c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1c400 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
1c410 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1c420 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1c430 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
1c440 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43   3);.  PAGERTRAC
1c450 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E4("FETCH %d pag
1c460 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1c470 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c480 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1c490 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1c4a0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1c4b0 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  g));.  return rc
1c4c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1c4d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c4e0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
1c4f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
1c500 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
1c510 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
1c520 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
1c530 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
1c540 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
1c550 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
1c560 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
1c570 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1c580 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
1c590 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
1c5a0 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
1c5b0 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
1c5c0 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
1c5d0 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
1c5e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
1c5f0 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
1c600 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
1c610 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
1c620 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
1c630 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
1c640 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
1c650 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
1c660 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1c670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1c680 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20  t isHot = 0;..  
1c690 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
1c6a0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
1c6b0 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
1c6c0 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
1c6d0 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
1c6e0 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
1c6f0 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
1c700 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68  state, now is th
1c710 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  e chance to clea
1c720 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
1c730 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
1c740 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
1c750 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
1c760 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
1c770 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
1c780 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
1c790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
1c7a0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
1c7b0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
1c7c0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1c7d0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1c7e0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1c7f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1c800 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20   ){.      isHot 
1c810 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
1c820 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1c830 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1c840 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
1c850 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
1c860 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  f the pager is s
1c870 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72  till in an error
1c880 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70   state, do not p
1c890 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f  roceed. The erro
1c8a0 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69  r .  ** state wi
1c8b0 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  ll be cleared at
1c8c0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1c8d0 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61  he future when a
1c8e0 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65  ll page .  ** re
1c8f0 66 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f  ferences are dro
1c900 70 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  pped and the cac
1c910 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
1c920 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ded..  */.  if( 
1c930 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1c940 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1c950 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1c960 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
1c970 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c980 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1c990 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1c9a0 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29  NLOCK || isHot )
1c9b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1c9c0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1c9d0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20  ->pVfs;.    if( 
1c9e0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1c9f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ca00 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
1ca10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1ca20 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
1ca30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ca40 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1ca50 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
1ca60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ca70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ca80 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ca90 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1caa0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1cab0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1cac0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1cad0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1cae0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
1caf0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
1cb00 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
1cb10 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
1cb20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1cb30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
1cb40 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
1cb50 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
1cb60 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
1cb70 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
1cb80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1cb90 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
1cba0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1cbb0 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
1cbc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cbd0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1cbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cbf0 20 72 63 3d 3d 31 20 7c 7c 20 69 73 48 6f 74 20   rc==1 || isHot 
1cc00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
1cc10 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1cc20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1cc30 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
1cc40 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
1cc50 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
1cc60 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
1cc70 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
1cc80 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
1cc90 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
1cca0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1ccb0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
1ccc0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1ccd0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
1cce0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1ccf0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
1cd00 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
1cd10 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
1cd20 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1cd30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
1cd40 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
1cd50 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
1cd60 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
1cd70 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
1cd80 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
1cd90 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
1cda0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
1cdb0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
1cdc0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
1cdd0 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
1cde0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
1cdf0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
1ce00 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
1ce10 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
1ce20 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
1ce30 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
1ce40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1ce50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce60 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1ce70 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1ce80 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
1ce90 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
1cea0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ceb0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1cec0 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
1ced0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
1cee0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1cf00 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1cf10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
1cf20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1cf30 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1cf40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1cf50 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1cf60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1cf70 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20  LUSIVE;.        
1cf80 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  }. .        /* O
1cf90 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1cfa0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
1cfb0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1cfc0 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
1cfd0 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
1cfe0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1cff0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
1d000 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1d010 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1d020 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
1d030 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
1d040 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
1d050 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1d060 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
1d070 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
1d080 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1d090 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  holds.        **
1d0a0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
1d0b0 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
1d0c0 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
1d0d0 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
1d0e0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
1d0f0 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
1d100 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
1d110 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  time..        **
1d120 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
1d130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1d140 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
1d150 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
1d160 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20  use in .        
1d170 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
1d180 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
1d190 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
1d1a0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
1d1b0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
1d1c0 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
1d1d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
1d1e0 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
1d1f0 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
1d200 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
1d210 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
1d220 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1d230 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
1d240 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
1d250 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
1d260 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
1d270 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1d280 28 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  ( !isHot ){.    
1d290 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
1d2a0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1d2b0 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f  pVfs,pPager->zJo
1d2c0 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43  urnal,SQLITE_ACC
1d2d0 45 53 53 5f 45 58 49 53 54 53 29 3b 0a 20 20 20  ESS_EXISTS);.   
1d2e0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d         if( res==
1d2f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1d300 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
1d310 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
1d320 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
1d330 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
1d340 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1d350 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
1d360 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1d370 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1d380 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d390 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1d3a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d3b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1d3c0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
1d3d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1d3e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1d3f0 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
1d400 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
1d410 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51       if( fout&SQ
1d420 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1d430 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
1d440 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d450 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1d460 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1d470 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
1d480 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1d490 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d4b0 20 28 72 65 73 3d 3d 30 3f 53 51 4c 49 54 45 5f   (res==0?SQLITE_
1d4c0 42 55 53 59 3a 53 51 4c 49 54 45 5f 49 4f 45 52  BUSY:SQLITE_IOER
1d4d0 52 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  R_NOMEM);.      
1d4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1d4f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d510 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
1d520 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1d530 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 72         switch( r
1d540 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
1d550 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
1d560 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM:.            
1d570 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
1d580 52 5f 55 4e 4c 4f 43 4b 3a 0a 20 20 20 20 20 20  R_UNLOCK:.      
1d590 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1d5a0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 0a 20  E_IOERR_NOMEM:. 
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1d5c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d5d0 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1d5e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d5f0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
1d600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d610 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
1d620 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d630 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
1d640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1d650 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
1d660 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d670 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
1d680 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
1d690 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
1d6a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d6b0 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
1d6c0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
1d6d0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
1d6e0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
1d6f0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
1d700 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20          ** lock 
1d710 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
1d720 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
1d730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d740 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1d750 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
1d760 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d780 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
1d790 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1d7a0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
1d7b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d7c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1d7d0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
1d7f0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1d800 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
1d810 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
1d820 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1d830 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
1d840 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
1d850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
1d860 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
1d870 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
1d880 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1d890 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  e file.        *
1d8a0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
1d8b0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
1d8c0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
1d8d0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1d8e0 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
1d8f0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1d900 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
1d910 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1d920 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20  .        ** has 
1d930 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
1d940 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1d950 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
1d960 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  sh the.        *
1d970 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20  * cache..       
1d980 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   **.        ** D
1d990 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
1d9a0 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
1d9b0 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
1d9c0 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
1d9d0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
1d9e0 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
1d9f0 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
1da00 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
1da10 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
1da20 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
1da30 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
1da40 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
1da50 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
1da60 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
1da70 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
1da80 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
1da90 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
1daa0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64          ** a cod
1dab0 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
1dac0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
1dad0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
1dae0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1daf0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
1db00 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
1db10 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  be .        ** d
1db20 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
1db30 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
1db40 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
1db50 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
1db60 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
1db70 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
1db80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1db90 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
1dba0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
1dbb0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
1dbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1dbd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1dbe0 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  er);..        if
1dbf0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1dc00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
1dc10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1dc20 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  rCode;.        }
1dc30 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
1dc40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
1dc50 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  {.          IOTR
1dc60 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
1dc70 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
1dc80 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1dc90 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
1dca0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1dcb0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
1dcc0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1dcd0 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
1dce0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
1dcf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1dd10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1dd20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1dd30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
1dd40 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
1dd50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
1dd60 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1dd70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1dd80 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
1dd90 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1dda0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1ddb0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
1ddc0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1ddd0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1dde0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ddf0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1de00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
1de10 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1de20 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
1de30 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1de40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1de50 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1de60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1de70 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1de80 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
1de90 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1dea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1deb0 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
1dec0 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
1ded0 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
1dee0 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
1def0 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
1df00 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
1df10 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
1df20 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
1df30 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
1df40 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
1df50 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
1df60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
1df70 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
1df80 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
1df90 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
1dfa0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1dfb0 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
1dfc0 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
1dfd0 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
1dfe0 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
1dff0 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
1e000 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
1e010 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
1e020 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
1e030 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
1e040 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e050 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
1e060 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
1e070 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
1e080 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
1e090 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
1e0a0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
1e0b0 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
1e0c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e0d0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
1e0e0 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
1e0f0 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
1e100 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
1e110 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
1e120 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1e130 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
1e140 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
1e150 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1e160 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1e170 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
1e180 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
1e190 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
1e1a0 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
1e1b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
1e1c0 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
1e1d0 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
1e1e0 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
1e1f0 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
1e200 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
1e210 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
1e220 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
1e230 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
1e240 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
1e250 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
1e260 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
1e270 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
1e280 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
1e290 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
1e2a0 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
1e2b0 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
1e2c0 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
1e2d0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
1e2e0 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
1e2f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
1e300 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
1e310 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
1e320 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
1e330 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e340 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
1e350 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20  nt nByteHdr;..  
1e360 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
1e370 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
1e380 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
1e390 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
1e3a0 2a 20 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a  * above are met:
1e3b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1e3c0 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
1e3d0 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61  mxPage.   || pPa
1e3e0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d  ger->lru.pFirst=
1e3f0 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a  =0 .   || MEMDB.
1e400 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c     || (pPager->l
1e410 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  ru.pFirstSynced=
1e420 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f  =0 && pPager->do
1e430 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20  NotSync).  ){.  
1e440 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
1e450 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1e460 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48  Page>=pPager->nH
1e470 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ash ){.      pag
1e480 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
1e490 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
1e4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
1e4b0 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
1e4c0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
1e4d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1e4e0 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
1e4f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e500 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1e510 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1e520 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1e530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1e540 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
1e550 3b 0a 20 20 20 20 6e 42 79 74 65 48 64 72 20 3d  ;.    nByteHdr =
1e560 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
1e570 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
1e580 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
1e590 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
1e5a0 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
1e5b0 6f 72 79 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  ory);.    pPg = 
1e5c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1e5d0 6e 42 79 74 65 48 64 72 20 29 3b 0a 20 20 20 20  nByteHdr );.    
1e5e0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
1e5f0 20 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33   pData = sqlite3
1e600 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  _malloc( pPager-
1e610 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1e620 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20     if( pData==0 
1e630 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e640 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20  e3_free(pPg);.  
1e650 20 20 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20        pPg = 0;. 
1e660 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e670 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
1e680 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1e690 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1e6a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1e6b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
1e6c0 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
1e6d0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
1e6e0 70 50 67 2c 20 30 2c 20 6e 42 79 74 65 48 64 72  pPg, 0, nByteHdr
1e6f0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 61 74  );.    pPg->pDat
1e700 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 70  a = pData;.    p
1e710 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
1e720 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
1e730 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
1e740 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  >pAll;.    pPage
1e750 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
1e760 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
1e770 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1e780 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65   /* Recycle an e
1e790 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74  xisting page wit
1e7a0 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75  h a zero ref-cou
1e7b0 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nt. */.    rc = 
1e7c0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
1e7d0 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20  ager, &pPg);.   
1e7e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e7f0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
1e800 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1e810 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
1e820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1e840 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1e850 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1e860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e870 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
1e880 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
1e890 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
1e8a0 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
1e8b0 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
1e8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e8d0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1e8e0 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
1e8f0 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
1e900 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
1e910 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
1e920 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1e930 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
1e940 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
1e950 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
1e960 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
1e970 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
1e980 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
1e990 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
1e9a0 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
1e9b0 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
1e9c0 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
1e9d0 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
1e9e0 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
1e9f0 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
1ea00 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
1ea10 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1ea20 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
1ea30 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
1ea40 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
1ea50 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1ea60 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
1ea70 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1ea80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ea90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
1eaa0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1eab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1eac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ead0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1eae0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1eaf0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1eb00 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
1eb10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
1eb20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
1eb30 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
1eb40 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
1eb50 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
1eb60 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
1eb70 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
1eb80 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
1eb90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1eba0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
1ebb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
1ebc0 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
1ebd0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1ebe0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
1ebf0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1ec00 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
1ec10 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
1ec20 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
1ec30 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
1ec40 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
1ec50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
1ec60 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
1ec70 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
1ec80 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
1ec90 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
1eca0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
1ecb0 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
1ecc0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
1ecd0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
1ece0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
1ecf0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
1ed00 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
1ed10 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
1ed20 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
1ed30 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
1ed40 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1ed50 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
1ed60 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
1ed70 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1ed80 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
1ed90 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
1eda0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
1edb0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
1edc0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
1edd0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1ede0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
1edf0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
1ee00 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
1ee10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
1ee20 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
1ee30 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
1ee40 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
1ee50 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
1ee60 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
1ee70 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
1ee80 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
1ee90 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
1eea0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
1eeb0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
1eec0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
1eed0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
1eee0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
1eef0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
1ef00 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
1ef10 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
1ef20 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
1ef30 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
1ef40 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
1ef50 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
1ef60 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
1ef70 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
1ef80 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
1ef90 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
1efa0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
1efb0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1efc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
1efd0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
1efe0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
1eff0 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
1f000 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
1f010 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
1f020 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
1f030 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
1f040 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1f050 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1f060 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1f070 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1f080 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1f090 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1f0a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f0b0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1f0c0 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1f0d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f0e0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1f0f0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1f100 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1f110 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1f120 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1f130 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1f140 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1f150 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
1f160 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
1f170 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1f180 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1f190 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1f1a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f1b0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1f1c0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1f1d0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1f1e0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1f1f0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1f200 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1f210 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1f220 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1f230 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1f240 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1f250 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1f260 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1f270 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1f280 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1f290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f2a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1f2b0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1f2c0 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1f2d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1f2e0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1f2f0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1f300 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1f310 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1f320 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1f330 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1f340 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1f350 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1f360 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1f370 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1f380 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1f390 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1f3a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f3b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1f3c0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1f3d0 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1f3e0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1f3f0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1f400 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1f410 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1f420 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1f430 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
1f440 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
1f450 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
1f460 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
1f470 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67  tabase file. pag
1f480 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69  erSharedLock() i
1f490 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20  s a no-op if .  
1f4a0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f  ** a database lo
1f4b0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
1f4c0 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
1f4d0 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1f4e0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
1f4f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f500 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f510 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1f520 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1f530 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70  R_UNLOCK );..  p
1f540 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
1f550 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1f560 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
1f570 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1f580 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
1f590 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
1f5a0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
1f5b0 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b  nMax;.    int h;
1f5c0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
1f5d0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
1f5e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c      rc = pagerAl
1f5f0 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65  locatePage(pPage
1f600 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1f610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f620 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f630 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rc;.    }..    p
1f640 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1f650 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
1f660 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67  MDB || pgno>pPag
1f670 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a  er->stmtSize );.
1f680 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1f690 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
1f6a0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
1f6b0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
1f6c0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
1f6d0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61  ync = 0;..    ma
1f6e0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
1f6f0 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
1f700 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ..    pPager->nR
1f710 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50  ef++;.    if( pP
1f720 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29  ager->nExtra>0 )
1f730 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
1f740 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
1f750 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
1f760 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
1f770 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d      }.    nMax =
1f780 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1f790 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1f7a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f7b0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1f7c0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1f7d0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71 6c  rCode;.      sql
1f7e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f7f0 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
1f800 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1f810 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
1f820 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c   page with data,
1f830 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69   either by readi
1f840 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1f850 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
1f860 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20  , or by setting 
1f870 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20  the entire page 
1f880 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  to zero..    */.
1f890 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e      if( nMax<(in
1f8a0 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20  t)pgno || MEMDB 
1f8b0 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26  || (noContent &&
1f8c0 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
1f8d0 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20  Rollback) ){.   
1f8e0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
1f8f0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1f900 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f910 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1f920 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f930 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
1f940 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  }.      memset(P
1f950 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1f960 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
1f970 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
1f980 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e  Pg->needRead = n
1f990 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61  oContent && !pPa
1f9a0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1f9b0 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ack;.      IOTRA
1f9c0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
1f9d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1f9e0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1f9f0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1fa00 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67  Page(pPager, pPg
1fa10 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
1fa20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fa30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1fa40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1fa50 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
1fa60 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  pgno = 0;.      
1fa70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1fa80 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1fa90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1faa0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
1fab0 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20  needRead = 0;.  
1fac0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
1fad0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
1fae0 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
1faf0 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
1fb00 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
1fb10 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
1fb20 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
1fb30 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
1fb40 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
1fb50 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
1fb60 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1fb70 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1fb80 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
1fb90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1fba0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
1fbb0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
1fbc0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
1fbd0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1fbe0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1fbf0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1fc00 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
1fc10 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1fc20 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1fc30 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
1fc40 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1fc50 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
1fc60 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1fc70 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1fc80 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
1fc90 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  =1);.    PAGER_I
1fca0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
1fcb0 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f  );.    if( !noCo
1fcc0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
1fcd0 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
1fce0 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20  ntent(pPg);.    
1fcf0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fd00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fd10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1fd20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
1fd30 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
1fd40 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1fd50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1fd60 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
1fd70 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1fd80 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1fd90 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1fda0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fdb0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1fdc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1fdd0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1fde0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1fdf0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1fe00 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1fe10 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1fe20 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1fe30 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1fe40 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1fe50 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1fe60 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1fe70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67  .  int rc;.  pag
1fe80 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
1fe90 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71  .  rc = pagerAcq
1fea0 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
1feb0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
1fec0 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65  tent);.  pagerLe
1fed0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
1fee0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1fef0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
1ff00 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
1ff10 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
1ff20 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
1ff30 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
1ff40 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
1ff50 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1ff60 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
1ff70 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
1ff80 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
1ff90 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
1ffa0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
1ffb0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
1ffc0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1ffd0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
1ffe0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
1fff0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
20000 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
20010 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
20020 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
20030 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
20040 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
20050 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
20060 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
20070 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
20080 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
20090 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
200a0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
200b0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
200c0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
200d0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
200e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
200f0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
20100 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  g = 0;..  assert
20110 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
20120 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
20130 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65   );..  pagerEnte
20140 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
20150 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
20160 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
20170 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
20180 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61  ger->pAll || pPa
20190 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
201a0 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  de );.  }else if
201b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
201c0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
201d0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
201e0 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e  L ){.    /* Do n
201f0 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73  othing */.  }els
20200 65 20 69 66 28 20 28 70 50 67 20 3d 20 70 61 67  e if( (pPg = pag
20210 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
20220 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20  , pgno))!=0 ){. 
20230 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
20240 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  ;.  }.  pagerLea
20250 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
20260 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
20270 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
20280 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
20290 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
202a0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
202b0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
202c0 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
202d0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
202e0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
202f0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
20300 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
20310 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
20320 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
20330 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
20340 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
20350 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
20360 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
20370 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
20380 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
20390 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
203a0 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  ..  /* Decrement
203b0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
203c0 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61  ount for this pa
203d0 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge.  */.  assert
203e0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
203f0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
20400 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50  g->pPager);.  pP
20410 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48  g->nRef--;..  CH
20420 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
20430 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
20440 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20450 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
20460 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
20470 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
20480 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
20490 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
204a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
204b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20  >nRef==0 ){..   
204c0 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29   lruListAdd(pPg)
204d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
204e0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
204f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
20500 44 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20  Destructor(pPg, 
20510 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20520 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
20530 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
20540 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
20550 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
20560 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
20570 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
20580 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
20590 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
205a0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
205b0 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
205c0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
205d0 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70  ->nRef==0 && (!p
205e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
205f0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
20600 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b  journalOff>0) ){
20610 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  .      pagerUnlo
20620 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
20630 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
20640 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
20650 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
20660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20670 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
20680 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
20690 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
206a0 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
206b0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
206c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
206d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
206e0 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
206f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
20700 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20710 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
20720 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
20730 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
20740 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
20750 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
20760 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
20770 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
20780 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
20790 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
207a0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
207b0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
207c0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c  ->pVfs;.  int fl
207d0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
207e0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
207f0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
20800 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  VE|SQLITE_OPEN_C
20810 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72  REATE);..  int r
20820 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
20830 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
20840 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20850 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
20860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20870 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
20880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20890 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
208a0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
208b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
208c0 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
208d0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ve(pPager);.  pP
208e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
208f0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20900 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
20910 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45  bSize);.  pagerE
20920 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
20930 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
20940 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
20950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
20960 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
20970 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
20980 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nal;.  }..  if( 
20990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
209a0 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  pen==0 ){.    if
209b0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
209c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  le ){.      flag
209d0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
209e0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
209f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
20a00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
20a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67  else{.      flag
20a20 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
20a30 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
20a40 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
20a50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
20a60 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72 63 20  IC_WRITE.    rc 
20a70 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
20a80 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70 56  Open(.        pV
20a90 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
20aa0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
20ab0 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
20ac0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
20ad0 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20  .    );.#else.  
20ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20af0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
20b00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
20b10 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
20b20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
20b30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20b40 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
20b50 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
20b60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
20b70 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
20b80 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
20b90 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
20ba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
20bb0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21  = 0;.    if( rc!
20bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20bd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20be0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
20bf0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
20c00 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
20c10 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
20c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
20c30 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
20c40 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d  n_journal;.    }
20c50 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
20c60 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
20c70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20c80 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
20c90 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
20ca0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
20cb0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
20cc0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
20cd0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
20ce0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
20cf0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
20d00 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
20d10 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
20d20 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
20d30 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
20d40 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
20d50 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
20d60 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
20d70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
20d80 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
20d90 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
20da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
20db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
20dc0 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
20dd0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
20de0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
20df0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72  QLITE_NOMEM && r
20e00 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
20e10 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
20e20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
20e30 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
20e40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
20e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20e80 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
20e90 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
20ea0 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  :.  sqlite3Bitve
20eb0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
20ec0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
20ed0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
20ee0 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  al = 0;.  return
20ef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
20f00 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
20f10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20f20 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
20f30 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
20f40 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
20f50 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
20f60 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
20f70 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
20f80 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c  haseTwo() is cal
20f90 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
20fa0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
20fb0 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
20fc0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
20fd0 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
20fe0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
20ff0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21000 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
21010 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
21020 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
21030 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
21040 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
21050 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
21060 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
21070 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
21080 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
21090 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
210a0 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
210b0 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
210c0 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
210d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
210e0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
210f0 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
21100 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
21110 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
21120 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
21130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
21140 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
21150 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
21160 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
21170 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
21180 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
21190 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
211a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
211b0 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
211c0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
211d0 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
211e0 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
211f0 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
21200 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
21210 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
21220 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
21230 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21240 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
21250 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
21260 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
21270 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
21280 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21290 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
212a0 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
212b0 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
212c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
212d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
212e0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
212f0 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
21300 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
21310 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
21320 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
21330 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
21340 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
21350 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
21360 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
21370 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
21380 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
21390 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
213a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
213b0 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
213c0 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
213d0 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
213e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
213f0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
21400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
21410 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
21420 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
21430 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
21440 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21450 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
21460 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
21470 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
21480 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
21490 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
214a0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
214b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
214c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
214d0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
214e0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
214f0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
21500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
21530 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
21540 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
21550 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21570 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
21580 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
21590 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
215a0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
215b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
215c0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
215d0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
215e0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
215f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21610 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65  .        pagerLe
21620 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
21630 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
21650 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21660 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
21670 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
21680 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
21690 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
216a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
216b0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
216c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
216e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
216f0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
21700 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
21710 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21720 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
21730 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
21740 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
21750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21760 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
21770 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
21780 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
21790 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
217a0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
217b0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
217c0 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
217d0 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
217e0 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
217f0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
21800 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
21810 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
21820 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
21830 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
21840 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
21850 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
21860 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65  pen and truncate
21870 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20  d to 0 bytes..  
21880 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
21890 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30   pPager->nRec==0
218a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
218b0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
218c0 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
218d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
218e0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
218f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
21900 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
21910 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
21920 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
21930 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
21940 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
21950 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64  reate( pPager->d
21960 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67  bSize );.    pag
21970 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
21980 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
21990 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->pInJournal ){.
219a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
219b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
219c0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
219d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
219e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
219f0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
21a00 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21a10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
21a20 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
21a30 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
21a40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21a50 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
21a60 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c  E_OK );.  pagerL
21a70 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
21a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21a90 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
21aa0 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
21ab0 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
21ac0 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
21ad0 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
21ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21af0 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
21b00 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
21b10 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
21b20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21b30 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
21b40 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
21b50 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
21b60 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
21b70 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
21b80 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
21b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
21ba0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
21bb0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
21bc0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
21bd0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
21be0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
21bf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
21c00 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
21c10 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
21c20 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
21c30 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
21c40 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
21c50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
21c60 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
21c70 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
21c80 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
21c90 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
21ca0 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
21cb0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
21cc0 74 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e  t( pPg->pDirty->
21cd0 70 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20  pPrevDirty==pPg 
21ce0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  );.      pPg->pD
21cf0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
21d00 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
21d10 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
21d20 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
21d30 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
21d40 74 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  t( pPg->pPrevDir
21d50 74 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20  ty->pDirty==pPg 
21d60 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  );.      pPg->pP
21d70 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
21d80 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
21d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21da0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
21db0 61 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50  ager->pDirty==pP
21dc0 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  g );.      pPg->
21dd0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21de0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
21df0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
21e00 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
21e10 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
21e20 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
21e30 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
21e40 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
21e50 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
21e60 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
21e70 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
21e80 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
21e90 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
21ea0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
21eb0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
21ec0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21ed0 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
21ee0 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
21ef0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
21f00 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
21f10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21f20 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
21f30 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
21f40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
21f50 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
21f60 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
21f70 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
21f80 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
21f90 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
21fa0 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
21fb0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
21fc0 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
21fd0 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
21fe0 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
21ff0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
22000 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
22010 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
22020 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
22030 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
22040 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
22050 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
22060 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
22070 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
22080 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
22090 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
220a0 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
220b0 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
220c0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
220d0 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
220e0 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
220f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
22100 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
22110 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  Rollback() to.**
22120 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
22130 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
22140 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
22150 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50   void *pData = P
22160 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22170 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
22180 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
22190 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
221a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
221b0 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
221c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
221d0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
221e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
221f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
22200 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
22210 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
22220 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
22230 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
22240 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
22250 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
22260 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  GE(pPg);..  /* I
22270 66 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20  f this page was 
22280 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
22290 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
222a0 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e  nt==1, that mean
222b0 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74  s.  ** we didn't
222c0 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20   really read in 
222d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
222e0 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63  he page.  This c
222f0 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28  an happen.  ** (
22300 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65  for example) whe
22310 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
22320 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  ing moved to the
22330 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a   freelist.  But.
22340 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20    ** now we are 
22350 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67  (perhaps) moving
22360 20 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66   the page off of
22370 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f   the freelist fo
22380 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64  r.  ** reuse and
22390 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
223a0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
223b0 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f  ntent so that co
223c0 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62  ntent.  ** can b
223d0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
223e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
223f0 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61  .  So do the rea
22400 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74  d at this.  ** t
22410 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ime..  */.  rc =
22420 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
22430 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72  nt(pPg);.  if( r
22440 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
22450 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rc;.  }..  /* Ma
22460 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
22470 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
22480 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
22490 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
224a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
224b0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
224c0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
224d0 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28   */.  makeDirty(
224e0 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  pPg);.  if( pPg-
224f0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
22500 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
22510 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  Pg) || pPager->s
22520 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
22530 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
22540 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65  yCache = 1;.  }e
22550 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
22560 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
22570 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
22580 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
22590 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
225a0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
225b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
225c0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
225d0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
225e0 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
225f0 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
22600 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
22610 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
22620 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
22630 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
22640 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
22650 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
22660 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22670 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
22680 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
22690 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
226a0 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
226b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
226c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
226d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
226e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
226f0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
22700 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
22710 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
22720 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
22730 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  Journal.        
22740 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
22750 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
22760 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
22770 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22780 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
22790 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
227a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
227b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
227c0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
227d0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
227e0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
227f0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
22800 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
22810 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
22820 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
22830 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
22840 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
22850 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
22860 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
22870 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
22880 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
22890 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
228a0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
228b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
228c0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
228d0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   && (pPager->jou
228e0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44  rnalOpen || MEMD
228f0 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  B) ){.      if( 
22900 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
22910 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
22920 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
22930 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
22940 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
22950 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
22960 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
22970 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
22980 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55  PAGERTRACE3("JOU
22990 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
229a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
229b0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
229c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
229d0 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d  t( pHist->pOrig=
229e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
229f0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73  pHist->pOrig = s
22a00 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
22a10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
22a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
22a30 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
22a40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
22a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22a60 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
22a70 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
22a80 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47  pHist->pOrig, PG
22a90 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
22aa0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
22ab0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ze);.        }el
22ac0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
22ad0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
22ae0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
22af0 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
22b00 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
22b10 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
22b20 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
22b30 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  e that.         
22b40 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
22b50 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
22b60 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
22b70 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
22b80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
22b90 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
22ba0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22bb0 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
22bc0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
22bd0 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r) );.          
22be0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
22bf0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
22c00 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
22c10 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
22c20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
22c30 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
22c40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
22c50 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
22c60 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
22c70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
22c80 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
22c90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22ca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22cb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22cc0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
22cd0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
22ce0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22d20 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
22d30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
22d40 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
22d50 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
22d60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22d70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22d90 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
22da0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
22db0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
22dc0 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
22de0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
22df0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
22e00 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
22e10 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
22e20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
22e30 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22e60 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
22e70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
22e80 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
22e90 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
22ea0 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
22eb0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
22ec0 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E5("JOURNAL %d p
22ed0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
22ee0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
22ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22f00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22f10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
22f20 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65  ->needSync, page
22f30 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
22f40 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
22f50 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
22f60 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
22f70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22f80 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20  . The .         
22f90 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
22fa0 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
22fb0 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
22fc0 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
22fd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
22fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
23010 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
23020 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
23030 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
23040 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
23050 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
23060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
23070 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
23080 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
23090 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
230a0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
230b0 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
230c0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
230d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
230e0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
230f0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
23100 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  et(pPager->pInSt
23110 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
23120 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23130 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
23140 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
23150 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
23160 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
23170 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
23180 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50  oSync;.        P
23190 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45  AGERTRACE4("APPE
231a0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
231b0 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
231d0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
231e0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
231f0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
23200 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  }.      if( pPg-
23210 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
23220 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
23230 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
23240 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e   }.      pPg->in
23250 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
23260 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
23270 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
23280 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
23290 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
232a0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
232b0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
232c0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
232d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
232e0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
232f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
23300 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
23310 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
23320 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
23330 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
23340 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
23350 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
23360 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
23370 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
23380 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
23390 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70  nUse .     && !p
233a0 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
233b0 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e  Pg) .     && (in
233c0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
233d0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20  ger->stmtSize . 
233e0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
233f0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
23400 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
23410 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
23420 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
23430 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
23440 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
23450 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
23460 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
23470 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
23480 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
23490 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
234a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
234b0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
234c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
234d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
234e0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
234f0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
23500 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
23510 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
23520 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23530 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
23540 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
23550 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
23560 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
23570 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23580 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23590 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
235a0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
235b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
235c0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
235d0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
235e0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
235f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23600 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
23610 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
23620 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
23630 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 7);.        rc
23640 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
23650 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
23660 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
23670 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
23680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23690 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
236a0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
236b0 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
236c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
236d0 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
236e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
236f0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
23700 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
23710 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
23720 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
23730 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
23740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
23760 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
23770 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
23780 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
23790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
237a0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d  Pager->pInStmt!=
237b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
237c0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
237d0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
237e0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
237f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
23800 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
23810 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
23820 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
23830 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
23840 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
23850 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
23860 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
23870 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
23880 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
23890 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
238a0 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
238b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
238c0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
238d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
238e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
238f0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
23900 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23910 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23920 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
23930 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
23940 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
23950 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
23960 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
23970 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
23980 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
23990 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
239a0 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
239b0 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
239c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
239d0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
239e0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
239f0 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
23a00 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
23a10 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
23a20 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
23a30 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
23a40 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
23a50 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
23a60 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
23a70 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
23a80 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
23a90 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
23aa0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
23ab0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
23ac0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
23ad0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
23ae0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
23af0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
23b00 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
23b10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
23b20 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
23b30 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
23b40 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
23b50 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
23b60 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
23b70 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
23b80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
23b90 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
23ba0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d  Pager);.  if( !M
23bb0 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
23bc0 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
23bd0 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
23be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
23bf0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
23c00 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
23c10 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
23c20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
23c30 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
23c40 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
23c50 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
23c60 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
23c70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
23c80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23c90 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
23ca0 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
23cb0 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
23cc0 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
23cd0 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
23ce0 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
23cf0 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
23d00 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
23d10 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
23d20 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
23d30 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
23d40 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
23d50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
23d60 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
23d70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
23d80 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
23d90 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
23da0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
23db0 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
23dc0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
23dd0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
23de0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
23df0 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
23e00 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
23e10 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
23e20 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
23e30 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
23e40 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
23e50 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
23e60 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
23e70 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
23e80 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
23e90 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
23ea0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
23eb0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50  1)) + 1;..    nP
23ec0 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74  ageCount = sqlit
23ed0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
23ee0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
23ef0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
23f00 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
23f10 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
23f20 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
23f30 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
23f40 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
23f50 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
23f60 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
23f70 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
23f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23f90 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
23fa0 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
23fb0 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
23fc0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
23fd0 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
23fe0 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
23ff0 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
24000 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
24010 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
24020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
24030 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
24040 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
24050 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
24060 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
24070 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
24080 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
24090 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
240a0 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
240b0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
240c0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
240d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
240e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
240f0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
24100 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24120 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
24130 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
24140 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
24150 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
24160 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
24170 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
24180 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
24190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
241a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
241b0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
241c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
241d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
241e0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
241f0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
24200 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
24210 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
24220 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
24230 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
24240 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
24250 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
24260 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e  /* If the PgHdr.
24270 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
24280 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
24290 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
242a0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
242b0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
242c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
242d0 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
242e0 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
242f0 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
24300 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
24310 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
24320 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
24330 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
24340 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
24350 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
24360 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
24370 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
24380 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
24390 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
243a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
243b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
243c0 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ( needSync ){.  
243d0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
243e0 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
243f0 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
24400 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
24410 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
24420 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
24430 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24440 65 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  e ) pPage->needS
24450 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
24460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
24470 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
24480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
24490 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
244a0 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
244b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
244c0 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
244d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
244e0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
244f0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
24500 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
24510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
24520 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
24530 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
24540 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
24550 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
24560 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
24570 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
24580 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
24590 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
245a0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
245b0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
245c0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
245d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
245e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
245f0 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
24600 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
24610 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
24620 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
24630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
24640 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
24650 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24660 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
24670 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
24680 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
24690 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
246a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
246b0 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  Overwrite(Pager 
246c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
246d0 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
246e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
246f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67    int rc;..  pag
24700 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
24710 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
24720 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
24730 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69  pgno, &pPg);.  i
24740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
24760 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24770 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
24780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24790 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74      memcpy(sqlit
247a0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
247b0 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67  Pg), pData, pPag
247c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
247d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
247e0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
247f0 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76  .  }.  pagerLeav
24800 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
24810 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
24820 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
24830 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
24840 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
24850 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
24860 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
24870 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
24880 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
24890 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
248a0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
248b0 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
248c0 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
248d0 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
248e0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
248f0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
24900 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
24910 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
24920 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
24930 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
24940 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
24950 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
24960 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
24970 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
24980 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
24990 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
249a0 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
249b0 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
249c0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
249d0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
249e0 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
249f0 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
24a00 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
24a10 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
24a20 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
24a30 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
24a40 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
24a50 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
24a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
24a70 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
24a80 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
24a90 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
24aa0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
24ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
24ac0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
24ad0 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
24ae0 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
24af0 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
24b00 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
24b10 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
24b20 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
24b30 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
24b40 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
24b50 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
24b60 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
24b70 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
24b80 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
24b90 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
24ba0 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
24bb0 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
24bc0 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
24bd0 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
24be0 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
24bf0 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
24c00 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
24c10 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
24c20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
24c30 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
24c40 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
24c50 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72  DontRollback() r
24c60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
24c70 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
24c80 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61  he.** page conta
24c90 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74  ins critical dat
24ca0 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
24cb0 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
24cc0 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ets.** rolled ba
24cd0 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74  ck in spite of t
24ce0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
24cf0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61  ontRollback() ca
24d00 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
24d10 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
24d20 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
24d30 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
24d40 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
24d50 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
24d60 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
24d70 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  ( MEMDB ) return
24d80 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
24d90 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61  Pager);.  pPg->a
24da0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
24db0 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
24dc0 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
24dd0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
24de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24df0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
24e00 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
24e10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24e20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
24e30 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
24e40 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
24e50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
24e60 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
24e70 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
24e80 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
24e90 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
24ea0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
24eb0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
24ec0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
24ed0 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
24ee0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
24ef0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
24f00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
24f10 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
24f20 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
24f30 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
24f40 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
24f50 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
24f60 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
24f70 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
24f80 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
24f90 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
24fa0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
24fb0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
24fc0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
24fd0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
24fe0 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
24ff0 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
25000 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
25010 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
25020 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
25030 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
25040 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
25050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25060 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
25070 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
25080 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
25090 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
250a0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
250b0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
250c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
250d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
250e0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
250f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
25100 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
25110 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
25120 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
25130 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
25140 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
25150 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d  Leave(pPager);.}
25160 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
25170 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
25180 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
25190 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
251a0 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
251b0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
251c0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
251d0 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
251e0 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
251f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
25200 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
25210 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
25220 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
25230 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
25240 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
25250 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  f we have not ye
25260 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  t actually read 
25270 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
25280 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20  his page (if.** 
25290 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
252a0 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20  ad flag is set) 
252b0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
252c0 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d  e acts as a prom
252d0 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77  ise.** that we w
252e0 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74  ill never need t
252f0 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  o read the page 
25300 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66  content in the f
25310 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65  uture..** so the
25320 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63   needRead flag c
25330 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  an be cleared at
25340 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
25350 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25360 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62  rDontRollback(Db
25370 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
25380 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
25390 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61  g->pPager;..  pa
253a0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
253b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
253c0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
253d0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20  _RESERVED );..  
253e0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
253f0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  l file is not op
25400 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65  en, or DontWrite
25410 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
25420 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20  ed on.  ** this 
25430 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28  page (DontWrite(
25440 29 20 73 65 74 73 20 74 68 65 20 61 6c 77 61 79  ) sets the alway
25450 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c  sRollback flag),
25460 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20   then this.  ** 
25470 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
25480 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
25490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
254a0 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61  pen==0 || pPg->a
254b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
254c0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
254d0 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  ollback ){.    p
254e0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
254f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
25500 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45   }.  assert( !ME
25510 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72  MDB );    /* For
25520 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67 65 72   a memdb, pPager
25530 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73  ->journalOpen is
25540 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a 23 69   always 0 */..#i
25550 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
25560 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20  RE_DELETE.  if( 
25570 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
25580 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
25590 20 3e 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   > pPager->origD
255a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
255b0 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
255c0 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45 5f  .  /* If SECURE_
255d0 44 45 4c 45 54 45 20 69 73 20 64 69 73 61 62 6c  DELETE is disabl
255e0 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
255f0 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
25600 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  is.  ** routine 
25610 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  can be called on
25620 20 61 20 70 61 67 65 20 66 6f 72 20 77 68 69 63   a page for whic
25630 68 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  h sqlite3PagerDo
25640 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20 68  ntWrite().  ** h
25650 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76  as not been prev
25660 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64 75  iously called du
25670 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 72  ring the same tr
25680 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
25690 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74 65  And if DontWrite
256a0 28 29 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c  () has previousl
256b0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  y been called, t
256c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
256d0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  * conditions mus
256e0 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2f 0a 20  t be met..  */. 
256f0 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69   assert( !pPg->i
25700 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
25710 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
25720 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
25730 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
25740 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
25750 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l!=0 );.  sqlite
25760 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
25770 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
25780 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67  Pg->pgno);.  pPg
25790 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
257a0 0a 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64  .  pPg->needRead
257b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
257c0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
257d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
257e0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3e 3d  ger->stmtSize >=
257f0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
25800 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ize );.    sqlit
25810 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
25820 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
25830 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50  ->pgno);.  }.  P
25840 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
25850 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
25860 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
25870 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
25880 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41  Pager));.  IOTRA
25890 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20  CE(("GARBAGE %p 
258a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
258b0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70 61 67  Pg->pgno)).  pag
258c0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
258d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
258e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
258f0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
25900 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25910 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
25920 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
25930 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
25940 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
25950 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
25960 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
25970 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25980 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20  nt isDirect){.  
25990 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
259a0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
259b0 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ter;.  int rc = 
259c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
259d0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
259e0 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20  eCountDone ){.  
259f0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
25a00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
25a10 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
25a20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25a30 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
25a40 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
25a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25a60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
25a70 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74     if( !isDirect
25a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
25a90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25aa0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
25ab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25ac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
25ad0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
25ae0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20  PgHdr);.        
25af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
25b00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25b10 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
25b20 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
25b30 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
25b40 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
25b50 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
25b60 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
25b70 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
25b80 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
25b90 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
25ba0 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69  r++;.    put32bi
25bb0 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52  ts(((char*)PGHDR
25bc0 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29  _TO_DATA(pPgHdr)
25bd0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
25be0 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20  nter);..    if( 
25bf0 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61 67  isDirect && pPag
25c00 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
25c10 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
25c20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50 47 48  void *zBuf = PGH
25c30 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
25c40 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
25c50 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
25c60 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
25c70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
25c80 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
25c90 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
25ca0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
25cb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
25cc0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
25cd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
25ce0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
25cf0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
25d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
25d10 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
25d20 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
25d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
25d40 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
25d50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
25d60 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
25d70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
25d80 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
25d90 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
25da0 66 6c 61 67 73 29 3b 0a 20 20 70 61 67 65 72 4c  flags);.  pagerL
25db0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
25dc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25dd0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
25de0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
25df0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
25e00 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
25e10 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
25e20 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
25e30 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
25e40 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
25e50 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
25e60 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
25e70 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
25e80 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
25e90 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
25ea0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
25eb0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
25ec0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
25ed0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
25ee0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
25ef0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
25f00 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
25f10 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
25f20 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
25f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
25f40 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
25f50 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
25f60 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
25f70 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
25f80 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
25f90 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
25fa0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
25fb0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
25fc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
25fd0 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
25fe0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
25ff0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
26000 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
26010 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
26020 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
26030 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
26040 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
26050 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
26060 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
26070 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
26080 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
26090 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
260a0 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
260b0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
260c0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
260d0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
260e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
260f0 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
26100 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
26110 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
26120 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
26130 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
26140 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
26150 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
26160 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
26170 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
26180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
26190 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
261a0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
261b0 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
261c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
261d0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
261e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
261f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
26200 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
26210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
26220 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54  ster, .  Pgno nT
26230 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79  runc,.  int noSy
26240 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  nc.){.  int rc =
26250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
26260 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
26270 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
26280 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
26290 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
262a0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
262b0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
262c0 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45  Trunc);.  pagerE
262d0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  nter(pPager);.. 
262e0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
262f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
26300 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
26310 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
26320 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
26330 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
26340 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
26350 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
26360 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
26370 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
26380 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
26390 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
263a0 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
263b0 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65  Hdr *pPg;..#ifde
263c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
263d0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
263e0 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77   /* The atomic-w
263f0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
26400 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
26410 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20   all of the.    
26420 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  ** following are
26430 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   true:.    **.  
26440 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69    **    + The fi
26450 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
26460 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
26470 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
26480 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
26490 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
264a0 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a  -size, and.    *
264b0 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d  *    + This comm
264c0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
264d0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
264e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
264f0 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63      **    + Exac
26500 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
26510 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
26520 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
26530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
26540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
26550 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
26560 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65  can be used, the
26570 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
26580 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20  le will never.  
26590 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20    ** be created 
265a0 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
265b0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
265c0 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72   int useAtomicWr
265d0 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  ite = (.        
265e0 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20  !zMaster && .   
265f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
26600 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
26610 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
26620 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75  && .        nTru
26630 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  nc==0 && .      
26640 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44    (0==pPager->pD
26650 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65  irty || 0==pPage
26660 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74  r->pDirty->pDirt
26670 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  y).    );.    if
26680 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
26690 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
266a0 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
266b0 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
266c0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
266d0 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
266e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
266f0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
26700 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
26710 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
26720 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
26730 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
26740 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
26750 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
26760 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
26770 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
26780 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
26790 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
267a0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
267b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
267c0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
267d0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
267e0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
267f0 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
26800 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
26810 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
26820 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
26830 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
26840 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
26850 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
26860 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
26870 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
26880 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
26890 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
268a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
268b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
268c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
268d0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
268e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
268f0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
26900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
26920 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
26930 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
26940 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
26950 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d  micWrite && rc==
26960 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64  SQLITE_OK ).#end
26970 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
26980 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
26990 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
269a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
269b0 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
269c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
269d0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
269e0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
269f0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
26a00 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
26a10 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
26a20 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
26a30 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
26a40 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
26a50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
26a60 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
26a70 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
26a80 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
26a90 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
26aa0 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
26ab0 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
26ac0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
26ad0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
26ae0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
26af0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26b10 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 72 63 20  pen );.      rc 
26b20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
26b30 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
26b40 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
26b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26b60 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
26b70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26b80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26b90 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
26ba0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
26bb0 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
26bc0 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
26bd0 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
26be0 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
26bf0 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
26c00 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
26c10 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
26c20 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
26c30 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
26c40 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
26c50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26c60 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
26c70 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
26c80 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
26c90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
26ca0 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
26cb0 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
26cc0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
26cd0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
26ce0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
26cf0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26d00 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
26d10 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
26d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26d30 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
26d40 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
26d50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26d60 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26d70 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
26d80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26d90 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
26da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26db0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26dc0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
26dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26de0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
26df0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
26e00 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
26e10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26e20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
26e30 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
26e40 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
26e50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26e60 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
26e70 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
26e80 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
26e90 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
26ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26eb0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
26ec0 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
26ed0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
26ee0 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
26ef0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
26f00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
26f10 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
26f20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
26f30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26f40 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
26f50 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
26f60 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
26f70 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
26f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26f90 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
26fa0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
26fb0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
26fc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
26fd0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
26fe0 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
26ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
27010 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
27020 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
27030 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
27040 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
27050 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
27060 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
27070 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
27080 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
27090 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
270a0 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
270b0 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
270c0 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
270d0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
270e0 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
270f0 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
27100 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
27110 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
27120 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
27130 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
27140 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
27150 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
27160 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
27170 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
27180 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
27190 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
271a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
271b0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
271c0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
271d0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
271e0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
271f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
27200 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
27210 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
27220 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
27230 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
27240 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
27250 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
27260 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
27270 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
27280 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
27290 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
272a0 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
272b0 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
272c0 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
272d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
272e0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
272f0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
27300 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
27310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27320 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
27330 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
27340 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
27350 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
27360 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
27370 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
27380 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
27390 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
273a0 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
273b0 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
273c0 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
273d0 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
273e0 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
273f0 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74  it is.     * bet
27400 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
27410 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
27420 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
27430 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
27440 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
27450 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27460 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
27470 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
27480 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
27490 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
274a0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
274b0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
274c0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
274d0 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
274e0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
274f0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
27500 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
27510 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
27520 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
27530 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
27540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27550 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
27560 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
27570 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
27580 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
27590 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
275a0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
275b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
275c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
275d0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
275e0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
275f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27600 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45  OR;.  }.  pagerE
27610 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
27620 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d  PAGERTRACE2("COM
27630 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
27640 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
27650 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27660 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
27670 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
27680 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
27690 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
276a0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
276b0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
276c0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
276d0 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
276e0 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
276f0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
27700 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
27710 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
27720 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
27730 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
27740 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
27750 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
27760 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
27770 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
27780 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
27790 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
277a0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
277b0 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
277c0 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
277d0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
277e0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
277f0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
27800 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
27810 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
27820 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
27830 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
27840 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
27850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27860 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
27870 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
27880 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
27890 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
278a0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
278b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
278c0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
278d0 45 44 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  ED;.    pagerLea
278e0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
278f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27900 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
27910 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27920 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
27930 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
27940 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27950 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
27960 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  CED || !pPager->
27970 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
27980 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
27990 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
279a0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
279b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
279c0 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  c);.  pagerLeave
279d0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
279e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
279f0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
27a00 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
27a10 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
27a20 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
27a30 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
27a40 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
27a50 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
27a60 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
27a70 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
27a80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
27a90 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
27aa0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
27ab0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
27ac0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
27ad0 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
27ae0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
27af0 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
27b00 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
27b10 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
27b20 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
27b30 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
27b40 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
27b50 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
27b60 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
27b70 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
27b80 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
27b90 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
27ba0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
27bb0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
27bc0 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
27bd0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
27be0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
27bf0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
27c00 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
27c10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27c20 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
27c30 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
27c40 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
27c50 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
27c60 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
27c70 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
27c80 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
27c90 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
27ca0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
27cb0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
27cc0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
27cd0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
27ce0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
27cf0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
27d00 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
27d10 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
27d20 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
27d30 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
27d40 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
27d50 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
27d60 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
27d70 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
27d80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27d90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
27da0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
27db0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
27dc0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
27dd0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
27de0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
27df0 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
27e00 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
27e10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
27e20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
27e30 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
27e40 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
27e50 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
27e60 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
27e70 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  e{.        PAGER
27e80 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
27e90 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
27ea0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
27eb0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
27ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
27ed0 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
27ee0 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
27ef0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
27f00 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
27f10 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
27f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
27f30 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
27f40 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
27f50 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
27f60 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
27f70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
27f80 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c  er->xReiniter(p,
27f90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27fa0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
27fb0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
27fc0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
27fd0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
27fe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
27ff0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
28000 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61  igDbSize;.    pa
28010 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
28020 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
28030 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28040 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
28050 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
28060 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
28070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28080 20 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72   }..  pagerEnter
28090 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
280a0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
280b0 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
280c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
280d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
280e0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
280f0 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
28100 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28110 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28120 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
28130 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
28140 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
28150 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
28160 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
28170 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
28180 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
28190 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
281a0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
281b0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
281c0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
281d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
281e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
281f0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
28200 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
28210 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
28220 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
28230 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
28240 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
28250 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
28260 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
28270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28280 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
28290 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
282a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
282b0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
282c0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72  ;.  }.  /* pager
282d0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20  _reset(pPager); 
282e0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
282f0 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20  ize = -1;..  /* 
28300 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
28310 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
28320 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
28330 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
28340 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68   pager.  ** cach
28350 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72  e. So call pager
28360 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20  _error() on the 
28370 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20  way out to make 
28380 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  any error .  ** 
28390 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  persistent..  */
283a0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72  .  rc = pager_er
283b0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
283c0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
283d0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
283e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
283f0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
28400 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
28410 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c   opened read-onl
28420 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
28430 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62  .** if the datab
28440 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72  ase is (in theor
28450 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a  y) writable..*/.
28460 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28470 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  Isreadonly(Pager
28480 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
28490 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
284a0 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Only;.}../*.** R
284b0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
284c0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
284d0 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  o the pager..*/.
284e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
284f0 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  Refcount(Pager *
28500 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
28510 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  n pPager->nRef;.
28520 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
28530 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
28540 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
28550 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
28560 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
28570 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
28580 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
28590 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
285a0 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
285b0 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
285c0 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
285d0 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
285e0 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
285f0 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
28600 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
28610 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
28620 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
28630 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
28640 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
28650 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
28660 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
28670 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
28680 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
28690 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
286a0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
286b0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
286c0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
286d0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
286e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  if../*.** Set th
286f0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
28700 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
28710 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
28720 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
28730 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
28740 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
28750 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
28760 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
28770 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
28780 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
28790 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
287a0 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
287b0 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
287c0 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
287d0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
287e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
287f0 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
28800 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
28810 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
28820 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
28830 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
28840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
28850 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
28860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28870 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20  >dbSize>=0 );.  
28880 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
28890 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
288a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
288b0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
288c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
288d0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
288e0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
288f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
28900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
28920 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
28930 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
28940 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
28950 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
28960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28970 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
28980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
28990 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
289a0 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
289b0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  t( pPager->pInSt
289c0 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  mt==0 );.  pPage
289d0 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->pInStmt = sql
289e0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
289f0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
28a00 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
28a10 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
28a20 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30  ager->pInStmt==0
28a30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
28a40 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
28a50 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
28a60 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
28a70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
28a80 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
28a90 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
28aa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
28ab0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
28ac0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
28ad0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
28ae0 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
28af0 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
28b00 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
28b10 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
28b20 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
28b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28b40 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
28b50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
28b60 65 72 2d 3e 73 74 66 64 2c 20 70 50 61 67 65 72  er->stfd, pPager
28b70 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20  ->zStmtJrnl,.   
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
28ba0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
28bb0 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  L);.    if( rc )
28bc0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d  {.      goto stm
28bd0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
28be0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
28bf0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
28c00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
28c10 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
28c20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28c30 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
28c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
28c50 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
28c60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
28c70 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
28c80 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
28c90 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
28ca0 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
28cb0 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  pInStmt = 0;.  }
28cc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28cd0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28ce0 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
28cf0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28d00 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rc;.  pagerEnter
28d10 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
28d20 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
28d30 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72  pPager);.  pager
28d40 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28d60 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
28d70 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
28d80 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
28d90 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
28da0 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72 45 6e  ager){.  pagerEn
28db0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
28dc0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
28dd0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
28de0 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
28df0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
28e00 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
28e10 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28e20 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
28e30 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
28e40 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
28e50 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
28e60 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
28e70 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
28e80 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  oy(pPager->pInSt
28e90 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  mt);.      pPage
28ea0 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->pInStmt = 0;.
28eb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28ec0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
28ed0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
28ee0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  =pNext){.       
28ef0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
28f00 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
28f10 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
28f20 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
28f30 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
28f40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
28f50 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20  ( pHist->inStmt 
28f60 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
28f70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
28f80 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
28f90 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
28fa0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
28fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
28fc0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
28fd0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
28fe0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
28ff0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
29000 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
29010 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
29020 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
29030 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
29040 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
29050 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
29060 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65  n = 0;.  pagerLe
29070 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
29080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
290a0 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
290b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
290c0 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28  gerStmtRollback(
290d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
290e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
290f0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
29100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
29110 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
29120 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
29130 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
29140 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29150 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
29160 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
29170 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69  *pPg;.      PgHi
29180 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
29190 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
291a0 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
291b0 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74  pPg=pHist->pNext
291c0 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Stmt){.        p
291d0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
291e0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
291f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
29200 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
29210 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
29220 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
29230 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
29240 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
29250 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
29260 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
29270 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
29280 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
29290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
292a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
292b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
292c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
292d0 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72  ;.      pager_tr
292e0 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
292f0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
29300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
29310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
29320 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
29330 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
29340 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29350 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
29360 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
29370 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
29380 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
29390 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
293a0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61   = 0;.  pagerLea
293b0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
293c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
293d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
293e0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
293f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
29400 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
29410 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
29420 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
29430 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
29440 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
29450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29460 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
29470 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
29480 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
29490 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
294a0 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
294b0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
294c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
294d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
294e0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
294f0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
29500 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
29510 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
29520 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
29530 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
29540 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
29550 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
29560 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
29570 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
29580 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
29590 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
295a0 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
295b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
295c0 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
295d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
295e0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
295f0 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
29600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29610 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
29620 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
29630 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
29640 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
29650 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
29660 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
29670 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
29680 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
29690 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
296a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
296b0 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
296c0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
296d0 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
296e0 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
296f0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
29700 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
29710 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
29720 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
29730 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29740 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
29750 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
29760 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
29770 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29780 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
29790 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
297a0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
297b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
297c0 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
297d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
297e0 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
297f0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
29800 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
29810 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
29820 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
29830 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
29840 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
29850 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  decArg;.}.#endif
29860 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29870 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
29880 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29890 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
298a0 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
298b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
298c0 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
298d0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
298e0 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
298f0 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67  located at.** pg
29900 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c  no (which we cal
29910 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68  l pPgOld) though
29920 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c   that page is al
29930 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69  lowed to be.** i
29940 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65  n cache.  If the
29950 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c   page previous l
29960 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
29970 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
29980 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
29990 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
299a0 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
299b0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
299c0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
299d0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
299e0 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
299f0 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
29a00 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
29a10 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
29a20 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
29a30 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
29a40 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
29a50 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
29a60 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
29a70 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
29a80 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
29a90 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
29aa0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
29ab0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
29ac0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
29ad0 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
29ae0 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
29af0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
29b00 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
29b10 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
29b20 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
29b30 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
29b40 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
29b50 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
29b60 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
29b70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
29b80 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
29b90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
29ba0 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
29bb0 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
29bc0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
29bd0 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
29be0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
29bf0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
29c00 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  */.  int h;.  Pg
29c10 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
29c20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  = 0;..  pagerEnt
29c30 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  er(pPager);.  as
29c40 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
29c50 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  0 );..  PAGERTRA
29c60 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE5("MOVE %d pag
29c70 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
29c80 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
29c90 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
29ca0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
29cb0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
29cc0 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f  ync, pgno);.  IO
29cd0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
29ce0 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
29cf0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
29d00 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74  o))..  pager_get
29d10 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
29d20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
29d30 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
29d40 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
29d50 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
29d60 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
29d70 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67  | (int)pgno>pPag
29d80 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
29d90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29da0 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
29db0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29dc0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
29dd0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
29de0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 2d 63   from its hash-c
29df0 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
29e00 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
29e10 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
29e20 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
29e30 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
29e40 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
29e50 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
29e60 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
29e70 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
29e80 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
29e90 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
29ea0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
29eb0 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
29ec0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
29ed0 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
29ee0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
29ef0 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
29f00 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e  e..  */.  pPg->n
29f10 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
29f20 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
29f30 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
29f40 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
29f50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29f60 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
29f70 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
29f80 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
29f90 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
29fa0 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
29fb0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
29fc0 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53   = pPgOld->needS
29fd0 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ync;.  }else{.  
29fe0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
29ff0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  = 0;.  }.  pPg->
2a000 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  inJournal = sqli
2a010 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
2a020 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2a030 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43  , pgno);..  /* C
2a040 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
2a050 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
2a060 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
2a070 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
2a080 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
2a090 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
2a0a0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
2a0b0 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
2a0c0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
2a0d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
2a0e0 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
2a0f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
2a100 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
2a110 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
2a120 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
2a130 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
2a140 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
2a150 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
2a160 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
2a170 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
2a180 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
2a190 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
2a1a0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
2a1b0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
2a1c0 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
2a1d0 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
2a1e0 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
2a1f0 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
2a200 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2a210 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
2a220 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
2a230 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
2a240 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
2a250 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2a260 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
2a270 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
2a280 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
2a290 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
2a2a0 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
2a2b0 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
2a2c0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .pInJournal bit 
2a2d0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
2a2e0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
2a2f0 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
2a300 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
2a310 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2a320 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
2a330 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
2a340 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
2a350 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2a360 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  e attempt to loa
2a370 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  d the page into 
2a380 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66  the page-cache f
2a390 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a  ails, (due.    *
2a3a0 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20  * to a malloc() 
2a3b0 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20  or IO failure), 
2a3c0 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e  clear the bit in
2a3d0 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b   the pInJournal[
2a3e0 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20  ].    ** array. 
2a3f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
2a400 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  e page is loaded
2a410 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61   and written aga
2a420 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69  in in.    ** thi
2a430 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
2a440 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
2a450 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2a460 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20   file before.   
2a470 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64   ** it is synced
2a480 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
2a490 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79  l file. This way
2a4a0 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20  , it may end up 
2a4b0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
2a4c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65  urnal file twice
2a4d0 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f  , but that is no
2a4e0 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20  t a problem..   
2a4f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2a500 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a510 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
2a520 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
2a530 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
2a540 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
2a550 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
2a560 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
2a570 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
2a580 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
2a590 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
2a5a0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2a5b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2a5c0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2a5d0 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
2a5e0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
2a5f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a600 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
2a610 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2a620 6c 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53 79  l && (int)needSy
2a630 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
2a640 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
2a650 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
2a660 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
2a670 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
2a680 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20  dSyncPgno);.    
2a690 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 4c    }.      pagerL
2a6a0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
2a6b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a6c0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
2a6d0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
2a6e0 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53     pPgHdr->needS
2a6f0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
2a700 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  Hdr->inJournal =
2a710 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74   1;.    makeDirt
2a720 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
2a730 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2a740 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
2a750 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
2a760 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
2a770 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a780 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
2a790 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2a7a0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
2a7b0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
2a7c0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
2a7d0 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
2a7e0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
2a7f0 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
2a800 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
2a810 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2a820 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
2a830 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
2a840 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
2a850 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
2a860 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
2a870 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
2a880 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
2a890 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
2a8a0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2a8b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2a8c0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
2a8d0 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
2a8e0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
2a8f0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
2a900 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
2a910 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
2a920 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
2a930 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
2a940 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
2a950 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
2a960 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2a970 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
2a980 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2a990 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
2a9a0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
2a9b0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
2a9c0 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
2a9d0 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
2a9e0 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
2a9f0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
2aa00 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
2aa10 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
2aa20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2aa30 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
2aa40 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2aa50 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
2aa60 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
2aa70 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
2aa80 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
2aa90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2aaa0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
2aab0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2aac0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
2aad0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
2aae0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
2aaf0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
2ab00 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
2ab10 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2ab20 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
2ab30 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
2ab40 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2ab50 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2ab60 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2ab70 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
2ab80 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2ab90 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2aba0 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
2abb0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2abc0 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
2abd0 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
2abe0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
2abf0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
2ac00 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64  usiveMode = eMod
2ac10 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
2ac20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
2ac30 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
2ac40 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
2ac50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
2ac60 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
2ac70 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
2ac80 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
2ac90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2aca0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4a  E_QUERY, PAGER_J
2acb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
2acc0 45 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4a  E or .** PAGER_J
2acd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2ace0 53 54 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  ST. If the param
2acf0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
2ad00 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
2ad10 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
2ad20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
2ad30 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
2ad40 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
2ad50 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
2ad60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ad70 5f 44 45 4c 45 54 45 20 6f 72 0a 2a 2a 20 50 41  _DELETE or.** PA
2ad80 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ad90 50 45 52 53 49 53 54 2c 20 69 6e 64 69 63 61 74  PERSIST, indicat
2ada0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2adb0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
2adc0 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  d).** journal-mo
2add0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
2ade0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f  e3PagerJournalMo
2adf0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
2ae00 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
2ae10 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
2ae20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ae30 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
2ae40 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
2ae50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2ae60 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20  ELETE.          
2ae70 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2ae80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
2ae90 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20  RSIST.          
2aea0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2aeb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2aec0 46 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  F );.  assert( P
2aed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2aee0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
2aef0 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2af00 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3e 3d  NALMODE_DELETE>=
2af10 30 20 26 26 20 50 41 47 45 52 5f 4a 4f 55 52 4e  0 && PAGER_JOURN
2af20 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3e 3d  ALMODE_PERSIST>=
2af30 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
2af40 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >=0 ){.    pPage
2af50 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2af60 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65   eMode;.  }.  re
2af70 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
2af80 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
2af90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2afa0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  TEST./*.** Print
2afb0 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
2afc0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
2afd0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
2afe0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
2aff0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
2b000 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
2b010 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
2b020 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
2b030 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
2b040 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
2b050 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
2b060 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
2b070 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
2b080 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
2b090 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
2b0a0 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
2b0b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
2b0c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
2b0d0 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
2b0e0 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
2b0f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2b100 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.